• Home
  • Raw
  • Download

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 */
78 * tcp and smb session status done differently for those three - in the in cifs_reconnect_tcon()
84 ses = tcon->ses; in cifs_reconnect_tcon()
85 server = ses->server; in cifs_reconnect_tcon()
91 spin_lock(&tcon->tc_lock); in cifs_reconnect_tcon()
92 if (tcon->status == TID_EXITING) { in cifs_reconnect_tcon()
94 spin_unlock(&tcon->tc_lock); in cifs_reconnect_tcon()
97 return -ENODEV; in cifs_reconnect_tcon()
100 spin_unlock(&tcon->tc_lock); in cifs_reconnect_tcon()
103 rc = cifs_wait_for_server_reconnect(server, tcon->retry); in cifs_reconnect_tcon()
107 spin_lock(&ses->chan_lock); in cifs_reconnect_tcon()
108 if (!cifs_chan_needs_reconnect(ses, server) && !tcon->need_reconnect) { in cifs_reconnect_tcon()
109 spin_unlock(&ses->chan_lock); in cifs_reconnect_tcon()
112 spin_unlock(&ses->chan_lock); in cifs_reconnect_tcon()
114 mutex_lock(&ses->session_mutex); in cifs_reconnect_tcon()
118 * and tcpStatus set to reconnect. in cifs_reconnect_tcon()
120 spin_lock(&server->srv_lock); in cifs_reconnect_tcon()
121 if (server->tcpStatus == CifsNeedReconnect) { in cifs_reconnect_tcon()
122 spin_unlock(&server->srv_lock); in cifs_reconnect_tcon()
123 mutex_unlock(&ses->session_mutex); in cifs_reconnect_tcon()
125 if (tcon->retry) in cifs_reconnect_tcon()
127 rc = -EHOSTDOWN; in cifs_reconnect_tcon()
130 spin_unlock(&server->srv_lock); in cifs_reconnect_tcon()
132 nls_codepage = ses->local_nls; in cifs_reconnect_tcon()
138 spin_lock(&ses->ses_lock); in cifs_reconnect_tcon()
139 spin_lock(&ses->chan_lock); in cifs_reconnect_tcon()
141 ses->ses_status == SES_GOOD) { in cifs_reconnect_tcon()
142 spin_unlock(&ses->chan_lock); in cifs_reconnect_tcon()
143 spin_unlock(&ses->ses_lock); in cifs_reconnect_tcon()
146 if (tcon->need_reconnect) in cifs_reconnect_tcon()
149 mutex_unlock(&ses->session_mutex); in cifs_reconnect_tcon()
152 spin_unlock(&ses->chan_lock); in cifs_reconnect_tcon()
153 spin_unlock(&ses->ses_lock); in cifs_reconnect_tcon()
160 if (rc || !tcon->need_reconnect) { in cifs_reconnect_tcon()
161 mutex_unlock(&ses->session_mutex); in cifs_reconnect_tcon()
168 mutex_unlock(&ses->session_mutex); in cifs_reconnect_tcon()
200 rc = -EAGAIN; in cifs_reconnect_tcon()
206 /* Allocate and return pointer to an SMB request buffer, and set basic
222 return -ENOMEM; in small_smb_init()
229 cifs_stats_inc(&tcon->num_smbs_sent); in small_smb_init()
246 buffer->Mid = get_next_mid(ses->server); in small_smb_init_no_tc()
247 if (ses->capabilities & CAP_UNICODE) in small_smb_init_no_tc()
248 buffer->Flags2 |= SMBFLG2_UNICODE; in small_smb_init_no_tc()
249 if (ses->capabilities & CAP_STATUS32) in small_smb_init_no_tc()
250 buffer->Flags2 |= SMBFLG2_ERR_STATUS; in small_smb_init_no_tc()
252 /* uid, tid can stay at zero as set in header assemble */ in small_smb_init_no_tc()
268 return -ENOMEM; in __smb_init()
281 cifs_stats_inc(&tcon->num_smbs_sent); in __smb_init()
304 spin_lock(&tcon->ses->chan_lock); in smb_init_no_reconnect()
305 if (cifs_chan_needs_reconnect(tcon->ses, tcon->ses->server) || in smb_init_no_reconnect()
306 tcon->need_reconnect) { in smb_init_no_reconnect()
307 spin_unlock(&tcon->ses->chan_lock); in smb_init_no_reconnect()
308 return -EHOSTDOWN; in smb_init_no_reconnect()
310 spin_unlock(&tcon->ses->chan_lock); in smb_init_no_reconnect()
320 if (pSMB->hdr.WordCount < 10) in validate_t2()
324 if (get_unaligned_le16(&pSMB->t2_rsp.ParameterOffset) > 1024 || in validate_t2()
325 get_unaligned_le16(&pSMB->t2_rsp.DataOffset) > 1024) in validate_t2()
328 total_size = get_unaligned_le16(&pSMB->t2_rsp.ParameterCount); in validate_t2()
335 total_size += get_unaligned_le16(&pSMB->t2_rsp.DataCount); in validate_t2()
336 if (total_size > get_bcc(&pSMB->hdr) || in validate_t2()
344 return -EINVAL; in validate_t2()
352 char *guid = pSMBr->u.extended_response.GUID; in decode_ext_sec_blob()
353 struct TCP_Server_Info *server = ses->server; in decode_ext_sec_blob()
355 count = get_bcc(&pSMBr->hdr); in decode_ext_sec_blob()
357 return -EIO; in decode_ext_sec_blob()
360 if (server->srv_count > 1) { in decode_ext_sec_blob()
362 if (memcmp(server->server_GUID, guid, SMB1_CLIENT_GUID_SIZE) != 0) { in decode_ext_sec_blob()
364 memcpy(server->server_GUID, guid, SMB1_CLIENT_GUID_SIZE); in decode_ext_sec_blob()
368 memcpy(server->server_GUID, guid, SMB1_CLIENT_GUID_SIZE); in decode_ext_sec_blob()
372 server->sec_ntlmssp = true; in decode_ext_sec_blob()
374 count -= SMB1_CLIENT_GUID_SIZE; in decode_ext_sec_blob()
376 pSMBr->u.extended_response.SecurityBlob, count, server); in decode_ext_sec_blob()
378 return -EINVAL; in decode_ext_sec_blob()
415 return -EIO; in CIFSSMBNegotiate()
423 pSMB->hdr.Mid = get_next_mid(server); in CIFSSMBNegotiate()
424 pSMB->hdr.Flags2 |= (SMBFLG2_UNICODE | SMBFLG2_ERR_STATUS); in CIFSSMBNegotiate()
426 if (should_set_ext_sec_flag(ses->sectype)) { in CIFSSMBNegotiate()
428 pSMB->hdr.Flags2 |= SMBFLG2_EXT_SEC; in CIFSSMBNegotiate()
439 memcpy(&pSMB->DialectsArray[count], protocols[i].name, len); in CIFSSMBNegotiate()
443 pSMB->ByteCount = cpu_to_le16(count); in CIFSSMBNegotiate()
450 server->dialect = le16_to_cpu(pSMBr->DialectIndex); in CIFSSMBNegotiate()
451 cifs_dbg(FYI, "Dialect: %d\n", server->dialect); in CIFSSMBNegotiate()
453 if ((pSMBr->hdr.WordCount <= 13) || (server->dialect == BAD_PROT)) { in CIFSSMBNegotiate()
454 /* core returns wct = 1, but we do not ask for core - otherwise in CIFSSMBNegotiate()
455 small wct just comes when dialect index is -1 indicating we in CIFSSMBNegotiate()
457 rc = -EOPNOTSUPP; in CIFSSMBNegotiate()
459 } else if (pSMBr->hdr.WordCount != 17) { in CIFSSMBNegotiate()
461 rc = -EOPNOTSUPP; in CIFSSMBNegotiate()
466 server->sec_mode = pSMBr->SecurityMode; in CIFSSMBNegotiate()
467 if ((server->sec_mode & SECMODE_USER) == 0) in CIFSSMBNegotiate()
472 server->maxReq = min_t(unsigned int, le16_to_cpu(pSMBr->MaxMpxCount), in CIFSSMBNegotiate()
474 set_credits(server, server->maxReq); in CIFSSMBNegotiate()
476 server->maxBuf = le32_to_cpu(pSMBr->MaxBufferSize); in CIFSSMBNegotiate()
477 /* set up max_read for readahead check */ in CIFSSMBNegotiate()
478 server->max_read = server->maxBuf; in CIFSSMBNegotiate()
479 server->max_rw = le32_to_cpu(pSMBr->MaxRawSize); in CIFSSMBNegotiate()
480 cifs_dbg(NOISY, "Max buf = %d\n", ses->server->maxBuf); in CIFSSMBNegotiate()
481 server->capabilities = le32_to_cpu(pSMBr->Capabilities); in CIFSSMBNegotiate()
482 server->timeAdj = (int)(__s16)le16_to_cpu(pSMBr->ServerTimeZone); in CIFSSMBNegotiate()
483 server->timeAdj *= 60; in CIFSSMBNegotiate()
485 if (pSMBr->EncryptionKeyLength == CIFS_CRYPTO_KEY_SIZE) { in CIFSSMBNegotiate()
486 server->negflavor = CIFS_NEGFLAVOR_UNENCAP; in CIFSSMBNegotiate()
487 memcpy(ses->server->cryptkey, pSMBr->u.EncryptionKey, in CIFSSMBNegotiate()
489 } else if (pSMBr->hdr.Flags2 & SMBFLG2_EXT_SEC || in CIFSSMBNegotiate()
490 server->capabilities & CAP_EXTENDED_SECURITY) { in CIFSSMBNegotiate()
491 server->negflavor = CIFS_NEGFLAVOR_EXTENDED; in CIFSSMBNegotiate()
493 } else if (server->sec_mode & SECMODE_PW_ENCRYPT) { in CIFSSMBNegotiate()
494 rc = -EIO; /* no crypt key only if plain text pwd */ in CIFSSMBNegotiate()
496 server->negflavor = CIFS_NEGFLAVOR_UNENCAP; in CIFSSMBNegotiate()
497 server->capabilities &= ~CAP_EXTENDED_SECURITY; in CIFSSMBNegotiate()
501 rc = cifs_enable_signing(server, ses->sign); in CIFSSMBNegotiate()
518 if ((tcon->ses == NULL) || (tcon->ses->server == NULL)) in CIFSSMBTDis()
519 return -EIO; in CIFSSMBTDis()
527 spin_lock(&tcon->ses->chan_lock); in CIFSSMBTDis()
528 if ((tcon->need_reconnect) || CIFS_ALL_CHANS_NEED_RECONNECT(tcon->ses)) { in CIFSSMBTDis()
529 spin_unlock(&tcon->ses->chan_lock); in CIFSSMBTDis()
530 return -EIO; in CIFSSMBTDis()
532 spin_unlock(&tcon->ses->chan_lock); in CIFSSMBTDis()
539 rc = SendReceiveNoRsp(xid, tcon->ses, (char *)smb_buffer, 0); in CIFSSMBTDis()
546 if (rc == -EAGAIN) in CIFSSMBTDis()
553 * This is a no-op for now. We're not really interested in the reply, but
554 * rather in the fact that the server sent one and that server->lstrp
562 struct TCP_Server_Info *server = mid->callback_data; in cifs_echo_callback()
584 if (server->capabilities & CAP_UNICODE) in CIFSSMBEcho()
585 smb->hdr.Flags2 |= SMBFLG2_UNICODE; in CIFSSMBEcho()
587 /* set up echo request */ in CIFSSMBEcho()
588 smb->hdr.Tid = 0xffff; in CIFSSMBEcho()
589 smb->hdr.WordCount = 1; in CIFSSMBEcho()
590 put_unaligned_le16(1, &smb->EchoCount); in CIFSSMBEcho()
591 put_bcc(1, &smb->hdr); in CIFSSMBEcho()
592 smb->Data[0] = 'a'; in CIFSSMBEcho()
623 if (!ses || !ses->server) in CIFSSMBLogoff()
624 return -EIO; in CIFSSMBLogoff()
626 mutex_lock(&ses->session_mutex); in CIFSSMBLogoff()
627 spin_lock(&ses->chan_lock); in CIFSSMBLogoff()
629 spin_unlock(&ses->chan_lock); in CIFSSMBLogoff()
633 spin_unlock(&ses->chan_lock); in CIFSSMBLogoff()
637 mutex_unlock(&ses->session_mutex); in CIFSSMBLogoff()
641 pSMB->hdr.Mid = get_next_mid(ses->server); in CIFSSMBLogoff()
643 if (ses->server->sign) in CIFSSMBLogoff()
644 pSMB->hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE; in CIFSSMBLogoff()
646 pSMB->hdr.Uid = ses->Suid; in CIFSSMBLogoff()
648 pSMB->AndXCommand = 0xFF; in CIFSSMBLogoff()
652 mutex_unlock(&ses->session_mutex); in CIFSSMBLogoff()
657 if (rc == -EAGAIN) in CIFSSMBLogoff()
682 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSPOSIXDelFile()
684 cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, in CIFSPOSIXDelFile()
689 name_len = copy_path_name(pSMB->FileName, fileName); in CIFSPOSIXDelFile()
693 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSPOSIXDelFile()
694 pSMB->MaxDataCount = 0; /* BB double check this with jra */ in CIFSPOSIXDelFile()
695 pSMB->MaxSetupCount = 0; in CIFSPOSIXDelFile()
696 pSMB->Reserved = 0; in CIFSPOSIXDelFile()
697 pSMB->Flags = 0; in CIFSPOSIXDelFile()
698 pSMB->Timeout = 0; in CIFSPOSIXDelFile()
699 pSMB->Reserved2 = 0; in CIFSPOSIXDelFile()
701 InformationLevel) - 4; in CIFSPOSIXDelFile()
709 pRqD->type = cpu_to_le16(type); in CIFSPOSIXDelFile()
710 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSPOSIXDelFile()
711 pSMB->DataOffset = cpu_to_le16(offset); in CIFSPOSIXDelFile()
712 pSMB->SetupCount = 1; in CIFSPOSIXDelFile()
713 pSMB->Reserved3 = 0; in CIFSPOSIXDelFile()
714 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSPOSIXDelFile()
717 pSMB->DataCount = cpu_to_le16(sizeof(struct unlink_psx_rq)); in CIFSPOSIXDelFile()
718 pSMB->TotalDataCount = cpu_to_le16(sizeof(struct unlink_psx_rq)); in CIFSPOSIXDelFile()
719 pSMB->ParameterCount = cpu_to_le16(params); in CIFSPOSIXDelFile()
720 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSPOSIXDelFile()
721 pSMB->InformationLevel = cpu_to_le16(SMB_POSIX_UNLINK); in CIFSPOSIXDelFile()
722 pSMB->Reserved4 = 0; in CIFSPOSIXDelFile()
724 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSPOSIXDelFile()
725 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSPOSIXDelFile()
731 cifs_stats_inc(&tcon->stats.cifs_stats.num_deletes); in CIFSPOSIXDelFile()
733 if (rc == -EAGAIN) in CIFSPOSIXDelFile()
756 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBDelFile()
757 name_len = cifsConvertToUTF16((__le16 *) pSMB->fileName, name, in CIFSSMBDelFile()
758 PATH_MAX, cifs_sb->local_nls, in CIFSSMBDelFile()
763 name_len = copy_path_name(pSMB->fileName, name); in CIFSSMBDelFile()
765 pSMB->SearchAttributes = in CIFSSMBDelFile()
767 pSMB->BufferFormat = 0x04; in CIFSSMBDelFile()
769 pSMB->ByteCount = cpu_to_le16(name_len + 1); in CIFSSMBDelFile()
770 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBDelFile()
772 cifs_stats_inc(&tcon->stats.cifs_stats.num_deletes); in CIFSSMBDelFile()
777 if (rc == -EAGAIN) in CIFSSMBDelFile()
801 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBRmDir()
802 name_len = cifsConvertToUTF16((__le16 *) pSMB->DirName, name, in CIFSSMBRmDir()
803 PATH_MAX, cifs_sb->local_nls, in CIFSSMBRmDir()
808 name_len = copy_path_name(pSMB->DirName, name); in CIFSSMBRmDir()
811 pSMB->BufferFormat = 0x04; in CIFSSMBRmDir()
813 pSMB->ByteCount = cpu_to_le16(name_len + 1); in CIFSSMBRmDir()
814 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBRmDir()
816 cifs_stats_inc(&tcon->stats.cifs_stats.num_rmdirs); in CIFSSMBRmDir()
821 if (rc == -EAGAIN) in CIFSSMBRmDir()
845 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBMkDir()
846 name_len = cifsConvertToUTF16((__le16 *) pSMB->DirName, name, in CIFSSMBMkDir()
847 PATH_MAX, cifs_sb->local_nls, in CIFSSMBMkDir()
852 name_len = copy_path_name(pSMB->DirName, name); in CIFSSMBMkDir()
855 pSMB->BufferFormat = 0x04; in CIFSSMBMkDir()
857 pSMB->ByteCount = cpu_to_le16(name_len + 1); in CIFSSMBMkDir()
858 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBMkDir()
860 cifs_stats_inc(&tcon->stats.cifs_stats.num_mkdirs); in CIFSSMBMkDir()
865 if (rc == -EAGAIN) in CIFSSMBMkDir()
893 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSPOSIXCreate()
895 cifsConvertToUTF16((__le16 *) pSMB->FileName, name, in CIFSPOSIXCreate()
900 name_len = copy_path_name(pSMB->FileName, name); in CIFSPOSIXCreate()
905 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSPOSIXCreate()
906 pSMB->MaxDataCount = cpu_to_le16(1000); /* large enough */ in CIFSPOSIXCreate()
907 pSMB->MaxSetupCount = 0; in CIFSPOSIXCreate()
908 pSMB->Reserved = 0; in CIFSPOSIXCreate()
909 pSMB->Flags = 0; in CIFSPOSIXCreate()
910 pSMB->Timeout = 0; in CIFSPOSIXCreate()
911 pSMB->Reserved2 = 0; in CIFSPOSIXCreate()
913 InformationLevel) - 4; in CIFSPOSIXCreate()
917 pdata->Level = cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC); in CIFSPOSIXCreate()
918 pdata->Permissions = cpu_to_le64(mode); in CIFSPOSIXCreate()
919 pdata->PosixOpenFlags = cpu_to_le32(posix_flags); in CIFSPOSIXCreate()
920 pdata->OpenFlags = cpu_to_le32(*pOplock); in CIFSPOSIXCreate()
921 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSPOSIXCreate()
922 pSMB->DataOffset = cpu_to_le16(offset); in CIFSPOSIXCreate()
923 pSMB->SetupCount = 1; in CIFSPOSIXCreate()
924 pSMB->Reserved3 = 0; in CIFSPOSIXCreate()
925 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSPOSIXCreate()
928 pSMB->DataCount = cpu_to_le16(count); in CIFSPOSIXCreate()
929 pSMB->ParameterCount = cpu_to_le16(params); in CIFSPOSIXCreate()
930 pSMB->TotalDataCount = pSMB->DataCount; in CIFSPOSIXCreate()
931 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSPOSIXCreate()
932 pSMB->InformationLevel = cpu_to_le16(SMB_POSIX_OPEN); in CIFSPOSIXCreate()
933 pSMB->Reserved4 = 0; in CIFSPOSIXCreate()
935 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSPOSIXCreate()
936 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSPOSIXCreate()
946 if (rc || get_bcc(&pSMBr->hdr) < sizeof(OPEN_PSX_RSP)) { in CIFSPOSIXCreate()
947 rc = -EIO; /* bad smb */ in CIFSPOSIXCreate()
952 psx_rsp = (OPEN_PSX_RSP *)((char *) &pSMBr->hdr.Protocol in CIFSPOSIXCreate()
953 + le16_to_cpu(pSMBr->t2.DataOffset)); in CIFSPOSIXCreate()
955 *pOplock = le16_to_cpu(psx_rsp->OplockFlags); in CIFSPOSIXCreate()
957 *netfid = psx_rsp->Fid; /* cifs fid stays in le */ in CIFSPOSIXCreate()
958 /* Let caller know file was created so we can set the mode. */ in CIFSPOSIXCreate()
960 if (cpu_to_le32(FILE_CREATE) == psx_rsp->CreateAction) in CIFSPOSIXCreate()
963 if (psx_rsp->ReturnedLevel != cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC)) { in CIFSPOSIXCreate()
964 pRetData->Type = cpu_to_le32(-1); /* unknown */ in CIFSPOSIXCreate()
967 if (get_bcc(&pSMBr->hdr) < sizeof(OPEN_PSX_RSP) in CIFSPOSIXCreate()
970 pRetData->Type = cpu_to_le32(-1); in CIFSPOSIXCreate()
982 cifs_stats_inc(&tcon->stats.cifs_stats.num_posixmkdirs); in CIFSPOSIXCreate()
984 cifs_stats_inc(&tcon->stats.cifs_stats.num_posixopens); in CIFSPOSIXCreate()
986 if (rc == -EAGAIN) in CIFSPOSIXCreate()
1056 pSMB->AndXCommand = 0xFF; /* none */ in SMBLegacyOpen()
1058 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in SMBLegacyOpen()
1061 cifsConvertToUTF16((__le16 *) (pSMB->fileName + 1), in SMBLegacyOpen()
1067 name_len = copy_path_name(pSMB->fileName, fileName); in SMBLegacyOpen()
1070 pSMB->OpenFlags = cpu_to_le16(REQ_OPLOCK); in SMBLegacyOpen()
1072 pSMB->OpenFlags = cpu_to_le16(REQ_BATCHOPLOCK); in SMBLegacyOpen()
1074 pSMB->OpenFlags |= cpu_to_le16(REQ_MORE_INFO); in SMBLegacyOpen()
1075 pSMB->Mode = cpu_to_le16(access_flags_to_smbopen_mode(access_flags)); in SMBLegacyOpen()
1076 pSMB->Mode |= cpu_to_le16(0x40); /* deny none */ in SMBLegacyOpen()
1077 /* set file as system file if special file such in SMBLegacyOpen()
1082 pSMB->FileAttributes = cpu_to_le16(ATTR_SYSTEM); in SMBLegacyOpen()
1084 pSMB->FileAttributes = cpu_to_le16(0/*ATTR_NORMAL*/); in SMBLegacyOpen()
1087 pSMB->FileAttributes |= cpu_to_le16(ATTR_READONLY); in SMBLegacyOpen()
1090 /* pSMB->CreateOptions = cpu_to_le32(create_options & in SMBLegacyOpen()
1094 pSMB->Sattr = cpu_to_le16(ATTR_HIDDEN | ATTR_SYSTEM | ATTR_DIRECTORY); in SMBLegacyOpen()
1095 pSMB->OpenFunction = cpu_to_le16(convert_disposition(openDisposition)); in SMBLegacyOpen()
1099 pSMB->ByteCount = cpu_to_le16(count); in SMBLegacyOpen()
1100 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in SMBLegacyOpen()
1102 cifs_stats_inc(&tcon->stats.cifs_stats.num_opens); in SMBLegacyOpen()
1108 /* *pOplock = pSMBr->OplockLevel; */ /* BB take from action field*/ in SMBLegacyOpen()
1110 *netfid = pSMBr->Fid; /* cifs fid stays in le */ in SMBLegacyOpen()
1111 /* Let caller know file was created so we can set the mode. */ in SMBLegacyOpen()
1114 /* if (cpu_to_le32(FILE_CREATE) == pSMBr->CreateAction) in SMBLegacyOpen()
1119 pfile_info->CreationTime = 0; /* BB convert CreateTime*/ in SMBLegacyOpen()
1120 pfile_info->LastAccessTime = 0; /* BB fixme */ in SMBLegacyOpen()
1121 pfile_info->LastWriteTime = 0; /* BB fixme */ in SMBLegacyOpen()
1122 pfile_info->ChangeTime = 0; /* BB fixme */ in SMBLegacyOpen()
1123 pfile_info->Attributes = in SMBLegacyOpen()
1124 cpu_to_le32(le16_to_cpu(pSMBr->FileAttributes)); in SMBLegacyOpen()
1126 pfile_info->AllocationSize = in SMBLegacyOpen()
1127 cpu_to_le64(le32_to_cpu(pSMBr->EndOfFile)); in SMBLegacyOpen()
1128 pfile_info->EndOfFile = pfile_info->AllocationSize; in SMBLegacyOpen()
1129 pfile_info->NumberOfLinks = cpu_to_le32(1); in SMBLegacyOpen()
1130 pfile_info->DeletePending = 0; in SMBLegacyOpen()
1135 if (rc == -EAGAIN) in SMBLegacyOpen()
1150 struct cifs_sb_info *cifs_sb = oparms->cifs_sb; in CIFS_open()
1151 struct cifs_tcon *tcon = oparms->tcon; in CIFS_open()
1153 const struct nls_table *nls = cifs_sb->local_nls; in CIFS_open()
1154 int create_options = oparms->create_options; in CIFS_open()
1155 int desired_access = oparms->desired_access; in CIFS_open()
1156 int disposition = oparms->disposition; in CIFS_open()
1157 const char *path = oparms->path; in CIFS_open()
1166 req->AndXCommand = 0xFF; in CIFS_open()
1168 if (req->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFS_open()
1171 name_len = cifsConvertToUTF16((__le16 *)(req->fileName + 1), in CIFS_open()
1176 req->NameLength = cpu_to_le16(name_len); in CIFS_open()
1181 name_len = copy_path_name(req->fileName, path); in CIFS_open()
1182 req->NameLength = cpu_to_le16(name_len); in CIFS_open()
1186 req->OpenFlags = cpu_to_le32(REQ_OPLOCK); in CIFS_open()
1188 req->OpenFlags = cpu_to_le32(REQ_BATCHOPLOCK); in CIFS_open()
1190 req->DesiredAccess = cpu_to_le32(desired_access); in CIFS_open()
1191 req->AllocationSize = 0; in CIFS_open()
1194 * Set file as system file if special file such as fifo and server in CIFS_open()
1198 req->FileAttributes = cpu_to_le32(ATTR_SYSTEM); in CIFS_open()
1200 req->FileAttributes = cpu_to_le32(ATTR_NORMAL); in CIFS_open()
1206 if (tcon->ses->capabilities & CAP_UNIX) in CIFS_open()
1207 req->FileAttributes |= cpu_to_le32(ATTR_POSIX_SEMANTICS); in CIFS_open()
1210 req->FileAttributes |= cpu_to_le32(ATTR_READONLY); in CIFS_open()
1212 req->ShareAccess = cpu_to_le32(FILE_SHARE_ALL); in CIFS_open()
1213 req->CreateDisposition = cpu_to_le32(disposition); in CIFS_open()
1214 req->CreateOptions = cpu_to_le32(create_options & CREATE_OPTIONS_MASK); in CIFS_open()
1217 req->ImpersonationLevel = cpu_to_le32(SECURITY_IMPERSONATION); in CIFS_open()
1218 req->SecurityFlags = SECURITY_CONTEXT_TRACKING|SECURITY_EFFECTIVE_ONLY; in CIFS_open()
1223 req->ByteCount = cpu_to_le16(count); in CIFS_open()
1224 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *)req, in CIFS_open()
1226 cifs_stats_inc(&tcon->stats.cifs_stats.num_opens); in CIFS_open()
1230 if (rc == -EAGAIN) in CIFS_open()
1236 *oplock = rsp->OplockLevel; in CIFS_open()
1238 oparms->fid->netfid = rsp->Fid; in CIFS_open()
1239 oparms->fid->access = desired_access; in CIFS_open()
1241 /* Let caller know file was created so we can set the mode. */ in CIFS_open()
1243 if (cpu_to_le32(FILE_CREATE) == rsp->CreateAction) in CIFS_open()
1248 memcpy(&buf->common_attributes, in CIFS_open()
1249 &rsp->common_attributes, in CIFS_open()
1250 sizeof(buf->common_attributes)); in CIFS_open()
1252 buf->AllocationSize = rsp->AllocationSize; in CIFS_open()
1253 buf->EndOfFile = rsp->EndOfFile; in CIFS_open()
1254 buf->NumberOfLinks = cpu_to_le32(1); in CIFS_open()
1255 buf->DeletePending = 0; in CIFS_open()
1265 struct cifs_readdata *rdata = mid->callback_data; in cifs_readv_callback()
1266 struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink); in cifs_readv_callback()
1267 struct TCP_Server_Info *server = tcon->ses->server; in cifs_readv_callback()
1268 struct smb_rqst rqst = { .rq_iov = rdata->iov, in cifs_readv_callback()
1270 .rq_iter_size = iov_iter_count(&rdata->iter), in cifs_readv_callback()
1271 .rq_iter = rdata->iter }; in cifs_readv_callback()
1275 __func__, mid->mid, mid->mid_state, rdata->result, in cifs_readv_callback()
1276 rdata->bytes); in cifs_readv_callback()
1278 switch (mid->mid_state) { in cifs_readv_callback()
1280 /* result already set, check signature */ in cifs_readv_callback()
1281 if (server->sign) { in cifs_readv_callback()
1285 mid->sequence_number); in cifs_readv_callback()
1291 task_io_account_read(rdata->got_bytes); in cifs_readv_callback()
1292 cifs_stats_bytes_read(tcon, rdata->got_bytes); in cifs_readv_callback()
1296 rdata->result = -EAGAIN; in cifs_readv_callback()
1297 if (server->sign && rdata->got_bytes) in cifs_readv_callback()
1299 rdata->got_bytes = 0; in cifs_readv_callback()
1301 task_io_account_read(rdata->got_bytes); in cifs_readv_callback()
1302 cifs_stats_bytes_read(tcon, rdata->got_bytes); in cifs_readv_callback()
1305 rdata->result = -EIO; in cifs_readv_callback()
1308 queue_work(cifsiod_wq, &rdata->work); in cifs_readv_callback()
1313 /* cifs_async_readv - send an async write, and set up mid to handle result */
1320 struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink); in cifs_async_readv()
1321 struct smb_rqst rqst = { .rq_iov = rdata->iov, in cifs_async_readv()
1325 __func__, rdata->offset, rdata->bytes); in cifs_async_readv()
1327 if (tcon->ses->capabilities & CAP_LARGE_FILES) in cifs_async_readv()
1331 if ((rdata->offset >> 32) > 0) { in cifs_async_readv()
1333 return -EIO; in cifs_async_readv()
1341 smb->hdr.Pid = cpu_to_le16((__u16)rdata->pid); in cifs_async_readv()
1342 smb->hdr.PidHigh = cpu_to_le16((__u16)(rdata->pid >> 16)); in cifs_async_readv()
1344 smb->AndXCommand = 0xFF; /* none */ in cifs_async_readv()
1345 smb->Fid = rdata->cfile->fid.netfid; in cifs_async_readv()
1346 smb->OffsetLow = cpu_to_le32(rdata->offset & 0xFFFFFFFF); in cifs_async_readv()
1348 smb->OffsetHigh = cpu_to_le32(rdata->offset >> 32); in cifs_async_readv()
1349 smb->Remaining = 0; in cifs_async_readv()
1350 smb->MaxCount = cpu_to_le16(rdata->bytes & 0xFFFF); in cifs_async_readv()
1351 smb->MaxCountHigh = cpu_to_le32(rdata->bytes >> 16); in cifs_async_readv()
1353 smb->ByteCount = 0; in cifs_async_readv()
1358 smbr->ByteCount = 0; in cifs_async_readv()
1362 rdata->iov[0].iov_base = smb; in cifs_async_readv()
1363 rdata->iov[0].iov_len = 4; in cifs_async_readv()
1364 rdata->iov[1].iov_base = (char *)smb + 4; in cifs_async_readv()
1365 rdata->iov[1].iov_len = get_rfc1002_length(smb); in cifs_async_readv()
1367 kref_get(&rdata->refcount); in cifs_async_readv()
1368 rc = cifs_call_async(tcon->ses->server, &rqst, cifs_readv_receive, in cifs_async_readv()
1372 cifs_stats_inc(&tcon->stats.cifs_stats.num_reads); in cifs_async_readv()
1374 kref_put(&rdata->refcount, cifs_readdata_release); in cifs_async_readv()
1384 int rc = -EACCES; in CIFSSMBRead()
1392 __u32 pid = io_parms->pid; in CIFSSMBRead()
1393 __u16 netfid = io_parms->netfid; in CIFSSMBRead()
1394 __u64 offset = io_parms->offset; in CIFSSMBRead()
1395 struct cifs_tcon *tcon = io_parms->tcon; in CIFSSMBRead()
1396 unsigned int count = io_parms->length; in CIFSSMBRead()
1399 if (tcon->ses->capabilities & CAP_LARGE_FILES) in CIFSSMBRead()
1405 return -EIO; in CIFSSMBRead()
1414 pSMB->hdr.Pid = cpu_to_le16((__u16)pid); in CIFSSMBRead()
1415 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid >> 16)); in CIFSSMBRead()
1418 if (tcon->ses->server == NULL) in CIFSSMBRead()
1419 return -ECONNABORTED; in CIFSSMBRead()
1421 pSMB->AndXCommand = 0xFF; /* none */ in CIFSSMBRead()
1422 pSMB->Fid = netfid; in CIFSSMBRead()
1423 pSMB->OffsetLow = cpu_to_le32(offset & 0xFFFFFFFF); in CIFSSMBRead()
1425 pSMB->OffsetHigh = cpu_to_le32(offset >> 32); in CIFSSMBRead()
1427 pSMB->Remaining = 0; in CIFSSMBRead()
1428 pSMB->MaxCount = cpu_to_le16(count & 0xFFFF); in CIFSSMBRead()
1429 pSMB->MaxCountHigh = cpu_to_le32(count >> 16); in CIFSSMBRead()
1431 pSMB->ByteCount = 0; /* no need to do le conversion since 0 */ in CIFSSMBRead()
1436 pSMBW->ByteCount = 0; in CIFSSMBRead()
1440 iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4; in CIFSSMBRead()
1441 rc = SendReceive2(xid, tcon->ses, iov, 1, &resp_buf_type, in CIFSSMBRead()
1444 cifs_stats_inc(&tcon->stats.cifs_stats.num_reads); in CIFSSMBRead()
1449 int data_length = le16_to_cpu(pSMBr->DataLengthHigh); in CIFSSMBRead()
1451 data_length += le16_to_cpu(pSMBr->DataLength); in CIFSSMBRead()
1459 rc = -EIO; in CIFSSMBRead()
1462 pReadData = (char *) (&pSMBr->hdr.Protocol) + in CIFSSMBRead()
1463 le16_to_cpu(pSMBr->DataOffset); in CIFSSMBRead()
1466 rc = -EFAULT; in CIFSSMBRead()
1482 } /* else no valid buffer on return - leave as null */ in CIFSSMBRead()
1484 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBRead()
1494 int rc = -EACCES; in CIFSSMBWrite()
1500 __u32 pid = io_parms->pid; in CIFSSMBWrite()
1501 __u16 netfid = io_parms->netfid; in CIFSSMBWrite()
1502 __u64 offset = io_parms->offset; in CIFSSMBWrite()
1503 struct cifs_tcon *tcon = io_parms->tcon; in CIFSSMBWrite()
1504 unsigned int count = io_parms->length; in CIFSSMBWrite()
1509 if (tcon->ses == NULL) in CIFSSMBWrite()
1510 return -ECONNABORTED; in CIFSSMBWrite()
1512 if (tcon->ses->capabilities & CAP_LARGE_FILES) in CIFSSMBWrite()
1518 return -EIO; in CIFSSMBWrite()
1527 pSMB->hdr.Pid = cpu_to_le16((__u16)pid); in CIFSSMBWrite()
1528 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid >> 16)); in CIFSSMBWrite()
1531 if (tcon->ses->server == NULL) in CIFSSMBWrite()
1532 return -ECONNABORTED; in CIFSSMBWrite()
1534 pSMB->AndXCommand = 0xFF; /* none */ in CIFSSMBWrite()
1535 pSMB->Fid = netfid; in CIFSSMBWrite()
1536 pSMB->OffsetLow = cpu_to_le32(offset & 0xFFFFFFFF); in CIFSSMBWrite()
1538 pSMB->OffsetHigh = cpu_to_le32(offset >> 32); in CIFSSMBWrite()
1540 pSMB->Reserved = 0xFFFFFFFF; in CIFSSMBWrite()
1541 pSMB->WriteMode = 0; in CIFSSMBWrite()
1542 pSMB->Remaining = 0; in CIFSSMBWrite()
1548 if (tcon->ses->capabilities & CAP_LARGE_WRITE_X) { in CIFSSMBWrite()
1551 bytes_sent = (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE) in CIFSSMBWrite()
1557 pSMB->DataOffset = in CIFSSMBWrite()
1558 cpu_to_le16(offsetof(struct smb_com_write_req, Data) - 4); in CIFSSMBWrite()
1560 memcpy(pSMB->Data, buf, bytes_sent); in CIFSSMBWrite()
1564 return -EINVAL; in CIFSSMBWrite()
1571 pSMB->DataLengthLow = cpu_to_le16(bytes_sent & 0xFFFF); in CIFSSMBWrite()
1572 pSMB->DataLengthHigh = cpu_to_le16(bytes_sent >> 16); in CIFSSMBWrite()
1576 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBWrite()
1581 pSMBW->ByteCount = cpu_to_le16(byte_count); in CIFSSMBWrite()
1584 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBWrite()
1586 cifs_stats_inc(&tcon->stats.cifs_stats.num_writes); in CIFSSMBWrite()
1590 *nbytes = le16_to_cpu(pSMBr->CountHigh); in CIFSSMBWrite()
1592 *nbytes += le16_to_cpu(pSMBr->Count); in CIFSSMBWrite()
1597 * OS/2 servers are known to set incorrect CountHigh values. in CIFSSMBWrite()
1605 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBWrite()
1618 struct cifs_writedata *wdata = mid->callback_data; in cifs_writev_callback()
1619 struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); in cifs_writev_callback()
1621 WRITE_RSP *smb = (WRITE_RSP *)mid->resp_buf; in cifs_writev_callback()
1624 switch (mid->mid_state) { in cifs_writev_callback()
1626 wdata->result = cifs_check_receive(mid, tcon->ses->server, 0); in cifs_writev_callback()
1627 if (wdata->result != 0) in cifs_writev_callback()
1630 written = le16_to_cpu(smb->CountHigh); in cifs_writev_callback()
1632 written += le16_to_cpu(smb->Count); in cifs_writev_callback()
1636 * client. OS/2 servers are known to set incorrect in cifs_writev_callback()
1639 if (written > wdata->bytes) in cifs_writev_callback()
1642 if (written < wdata->bytes) in cifs_writev_callback()
1643 wdata->result = -ENOSPC; in cifs_writev_callback()
1645 wdata->bytes = written; in cifs_writev_callback()
1649 wdata->result = -EAGAIN; in cifs_writev_callback()
1652 wdata->result = -EIO; in cifs_writev_callback()
1656 queue_work(cifsiod_wq, &wdata->work); in cifs_writev_callback()
1658 add_credits(tcon->ses->server, &credits, 0); in cifs_writev_callback()
1661 /* cifs_async_writev - send an async write, and set up mid to handle result */
1666 int rc = -EACCES; in cifs_async_writev()
1669 struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); in cifs_async_writev()
1673 if (tcon->ses->capabilities & CAP_LARGE_FILES) { in cifs_async_writev()
1677 if (wdata->offset >> 32 > 0) { in cifs_async_writev()
1679 return -EIO; in cifs_async_writev()
1687 smb->hdr.Pid = cpu_to_le16((__u16)wdata->pid); in cifs_async_writev()
1688 smb->hdr.PidHigh = cpu_to_le16((__u16)(wdata->pid >> 16)); in cifs_async_writev()
1690 smb->AndXCommand = 0xFF; /* none */ in cifs_async_writev()
1691 smb->Fid = wdata->cfile->fid.netfid; in cifs_async_writev()
1692 smb->OffsetLow = cpu_to_le32(wdata->offset & 0xFFFFFFFF); in cifs_async_writev()
1694 smb->OffsetHigh = cpu_to_le32(wdata->offset >> 32); in cifs_async_writev()
1695 smb->Reserved = 0xFFFFFFFF; in cifs_async_writev()
1696 smb->WriteMode = 0; in cifs_async_writev()
1697 smb->Remaining = 0; in cifs_async_writev()
1699 smb->DataOffset = in cifs_async_writev()
1700 cpu_to_le16(offsetof(struct smb_com_write_req, Data) - 4); in cifs_async_writev()
1710 rqst.rq_iter = wdata->iter; in cifs_async_writev()
1711 rqst.rq_iter_size = iov_iter_count(&wdata->iter); in cifs_async_writev()
1714 wdata->offset, wdata->bytes); in cifs_async_writev()
1716 smb->DataLengthLow = cpu_to_le16(wdata->bytes & 0xFFFF); in cifs_async_writev()
1717 smb->DataLengthHigh = cpu_to_le16(wdata->bytes >> 16); in cifs_async_writev()
1720 inc_rfc1001_len(&smb->hdr, wdata->bytes + 1); in cifs_async_writev()
1721 put_bcc(wdata->bytes + 1, &smb->hdr); in cifs_async_writev()
1726 inc_rfc1001_len(&smbw->hdr, wdata->bytes + 5); in cifs_async_writev()
1727 put_bcc(wdata->bytes + 5, &smbw->hdr); in cifs_async_writev()
1731 kref_get(&wdata->refcount); in cifs_async_writev()
1732 rc = cifs_call_async(tcon->ses->server, &rqst, NULL, in cifs_async_writev()
1736 cifs_stats_inc(&tcon->stats.cifs_stats.num_writes); in cifs_async_writev()
1738 kref_put(&wdata->refcount, release); in cifs_async_writev()
1754 __u32 pid = io_parms->pid; in CIFSSMBWrite2()
1755 __u16 netfid = io_parms->netfid; in CIFSSMBWrite2()
1756 __u64 offset = io_parms->offset; in CIFSSMBWrite2()
1757 struct cifs_tcon *tcon = io_parms->tcon; in CIFSSMBWrite2()
1758 unsigned int count = io_parms->length; in CIFSSMBWrite2()
1765 if (tcon->ses->capabilities & CAP_LARGE_FILES) { in CIFSSMBWrite2()
1771 return -EIO; in CIFSSMBWrite2()
1778 pSMB->hdr.Pid = cpu_to_le16((__u16)pid); in CIFSSMBWrite2()
1779 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid >> 16)); in CIFSSMBWrite2()
1782 if (tcon->ses->server == NULL) in CIFSSMBWrite2()
1783 return -ECONNABORTED; in CIFSSMBWrite2()
1785 pSMB->AndXCommand = 0xFF; /* none */ in CIFSSMBWrite2()
1786 pSMB->Fid = netfid; in CIFSSMBWrite2()
1787 pSMB->OffsetLow = cpu_to_le32(offset & 0xFFFFFFFF); in CIFSSMBWrite2()
1789 pSMB->OffsetHigh = cpu_to_le32(offset >> 32); in CIFSSMBWrite2()
1790 pSMB->Reserved = 0xFFFFFFFF; in CIFSSMBWrite2()
1791 pSMB->WriteMode = 0; in CIFSSMBWrite2()
1792 pSMB->Remaining = 0; in CIFSSMBWrite2()
1794 pSMB->DataOffset = in CIFSSMBWrite2()
1795 cpu_to_le16(offsetof(struct smb_com_write_req, Data) - 4); in CIFSSMBWrite2()
1797 pSMB->DataLengthLow = cpu_to_le16(count & 0xFFFF); in CIFSSMBWrite2()
1798 pSMB->DataLengthHigh = cpu_to_le16(count >> 16); in CIFSSMBWrite2()
1800 smb_hdr_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 1; in CIFSSMBWrite2()
1806 pSMB->ByteCount = cpu_to_le16(count + 1); in CIFSSMBWrite2()
1810 pSMBW->ByteCount = cpu_to_le16(count + 5); in CIFSSMBWrite2()
1818 rc = SendReceive2(xid, tcon->ses, iov, n_vec + 1, &resp_buf_type, 0, in CIFSSMBWrite2()
1821 cifs_stats_inc(&tcon->stats.cifs_stats.num_writes); in CIFSSMBWrite2()
1826 rc = -EIO; in CIFSSMBWrite2()
1829 *nbytes = le16_to_cpu(pSMBr->CountHigh); in CIFSSMBWrite2()
1831 *nbytes += le16_to_cpu(pSMBr->Count); in CIFSSMBWrite2()
1836 * servers are known to set incorrect CountHigh values. in CIFSSMBWrite2()
1844 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBWrite2()
1868 pSMB->Timeout = 0; in cifs_lockv()
1869 pSMB->NumberOfLocks = cpu_to_le16(num_lock); in cifs_lockv()
1870 pSMB->NumberOfUnlocks = cpu_to_le16(num_unlock); in cifs_lockv()
1871 pSMB->LockType = lock_type; in cifs_lockv()
1872 pSMB->AndXCommand = 0xFF; /* none */ in cifs_lockv()
1873 pSMB->Fid = netfid; /* netfid stays le */ in cifs_lockv()
1877 pSMB->ByteCount = cpu_to_le16(count); in cifs_lockv()
1880 iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4 - in cifs_lockv()
1885 cifs_stats_inc(&tcon->stats.cifs_stats.num_locks); in cifs_lockv()
1886 rc = SendReceive2(xid, tcon->ses, iov, 2, &resp_buf_type, in cifs_lockv()
1919 pSMB->Timeout = 0; in CIFSSMBLock()
1922 pSMB->Timeout = cpu_to_le32(-1);/* blocking - do not time out */ in CIFSSMBLock()
1924 pSMB->Timeout = 0; in CIFSSMBLock()
1927 pSMB->NumberOfLocks = cpu_to_le16(numLock); in CIFSSMBLock()
1928 pSMB->NumberOfUnlocks = cpu_to_le16(numUnlock); in CIFSSMBLock()
1929 pSMB->LockType = lockType; in CIFSSMBLock()
1930 pSMB->OplockLevel = oplock_level; in CIFSSMBLock()
1931 pSMB->AndXCommand = 0xFF; /* none */ in CIFSSMBLock()
1932 pSMB->Fid = smb_file_id; /* netfid stays le */ in CIFSSMBLock()
1935 pSMB->Locks[0].Pid = cpu_to_le16(netpid); in CIFSSMBLock()
1937 pSMB->Locks[0].LengthLow = cpu_to_le32((u32)len); in CIFSSMBLock()
1938 pSMB->Locks[0].LengthHigh = cpu_to_le32((u32)(len>>32)); in CIFSSMBLock()
1939 pSMB->Locks[0].OffsetLow = cpu_to_le32((u32)offset); in CIFSSMBLock()
1940 pSMB->Locks[0].OffsetHigh = cpu_to_le32((u32)(offset>>32)); in CIFSSMBLock()
1947 pSMB->ByteCount = cpu_to_le16(count); in CIFSSMBLock()
1953 rc = SendReceiveNoRsp(xid, tcon->ses, (char *)pSMB, flags); in CIFSSMBLock()
1955 cifs_stats_inc(&tcon->stats.cifs_stats.num_locks); in CIFSSMBLock()
1959 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBLock()
1992 pSMB->MaxSetupCount = 0; in CIFSSMBPosixLock()
1993 pSMB->Reserved = 0; in CIFSSMBPosixLock()
1994 pSMB->Flags = 0; in CIFSSMBPosixLock()
1995 pSMB->Reserved2 = 0; in CIFSSMBPosixLock()
1996 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBPosixLock()
2000 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBPosixLock()
2001 pSMB->MaxDataCount = cpu_to_le16(1000); /* BB find max SMB from sess */ in CIFSSMBPosixLock()
2002 pSMB->SetupCount = 1; in CIFSSMBPosixLock()
2003 pSMB->Reserved3 = 0; in CIFSSMBPosixLock()
2005 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FILE_INFORMATION); in CIFSSMBPosixLock()
2007 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBPosixLock()
2009 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBPosixLock()
2010 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBPosixLock()
2011 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBPosixLock()
2012 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBPosixLock()
2013 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBPosixLock()
2018 parm_data->lock_type = cpu_to_le16(lock_type); in CIFSSMBPosixLock()
2021 parm_data->lock_flags = cpu_to_le16(1); in CIFSSMBPosixLock()
2022 pSMB->Timeout = cpu_to_le32(-1); in CIFSSMBPosixLock()
2024 pSMB->Timeout = 0; in CIFSSMBPosixLock()
2026 parm_data->pid = cpu_to_le32(netpid); in CIFSSMBPosixLock()
2027 parm_data->start = cpu_to_le64(start_offset); in CIFSSMBPosixLock()
2028 parm_data->length = cpu_to_le64(len); /* normalize negative numbers */ in CIFSSMBPosixLock()
2030 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBPosixLock()
2031 pSMB->Fid = smb_file_id; in CIFSSMBPosixLock()
2032 pSMB->InformationLevel = cpu_to_le16(SMB_SET_POSIX_LOCK); in CIFSSMBPosixLock()
2033 pSMB->Reserved4 = 0; in CIFSSMBPosixLock()
2035 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBPosixLock()
2041 iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4; in CIFSSMBPosixLock()
2042 rc = SendReceive2(xid, tcon->ses, iov, 1 /* num iovecs */, in CIFSSMBPosixLock()
2056 if (rc || get_bcc(&pSMBr->hdr) < sizeof(*parm_data)) { in CIFSSMBPosixLock()
2057 rc = -EIO; /* bad smb */ in CIFSSMBPosixLock()
2060 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBPosixLock()
2061 data_count = le16_to_cpu(pSMBr->t2.DataCount); in CIFSSMBPosixLock()
2063 rc = -EIO; in CIFSSMBPosixLock()
2067 ((char *)&pSMBr->hdr.Protocol + data_offset); in CIFSSMBPosixLock()
2068 if (parm_data->lock_type == cpu_to_le16(CIFS_UNLCK)) in CIFSSMBPosixLock()
2069 pLockData->fl_type = F_UNLCK; in CIFSSMBPosixLock()
2071 if (parm_data->lock_type == in CIFSSMBPosixLock()
2073 pLockData->fl_type = F_RDLCK; in CIFSSMBPosixLock()
2074 else if (parm_data->lock_type == in CIFSSMBPosixLock()
2076 pLockData->fl_type = F_WRLCK; in CIFSSMBPosixLock()
2078 pLockData->fl_start = le64_to_cpu(parm_data->start); in CIFSSMBPosixLock()
2079 pLockData->fl_end = pLockData->fl_start + in CIFSSMBPosixLock()
2080 (le64_to_cpu(parm_data->length) ? in CIFSSMBPosixLock()
2081 le64_to_cpu(parm_data->length) - 1 : 0); in CIFSSMBPosixLock()
2082 pLockData->fl_pid = -le32_to_cpu(parm_data->pid); in CIFSSMBPosixLock()
2089 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBPosixLock()
2105 if (rc == -EAGAIN) in CIFSSMBClose()
2110 pSMB->FileID = (__u16) smb_file_id; in CIFSSMBClose()
2111 pSMB->LastWriteTime = 0xFFFFFFFF; in CIFSSMBClose()
2112 pSMB->ByteCount = 0; in CIFSSMBClose()
2113 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBClose()
2115 cifs_stats_inc(&tcon->stats.cifs_stats.num_closes); in CIFSSMBClose()
2117 if (rc != -EINTR) { in CIFSSMBClose()
2118 /* EINTR is expected when user ctl-c to kill app */ in CIFSSMBClose()
2124 if (rc == -EAGAIN) in CIFSSMBClose()
2141 pSMB->FileID = (__u16) smb_file_id; in CIFSSMBFlush()
2142 pSMB->ByteCount = 0; in CIFSSMBFlush()
2143 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBFlush()
2145 cifs_stats_inc(&tcon->stats.cifs_stats.num_flushes); in CIFSSMBFlush()
2172 pSMB->BufferFormat = 0x04; in CIFSSMBRename()
2173 pSMB->SearchAttributes = in CIFSSMBRename()
2177 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBRename()
2178 name_len = cifsConvertToUTF16((__le16 *) pSMB->OldFileName, in CIFSSMBRename()
2180 cifs_sb->local_nls, remap); in CIFSSMBRename()
2183 pSMB->OldFileName[name_len] = 0x04; /* pad */ in CIFSSMBRename()
2185 pSMB->OldFileName[name_len + 1] = 0x00; in CIFSSMBRename()
2187 cifsConvertToUTF16((__le16 *)&pSMB->OldFileName[name_len+2], in CIFSSMBRename()
2188 to_name, PATH_MAX, cifs_sb->local_nls, in CIFSSMBRename()
2193 name_len = copy_path_name(pSMB->OldFileName, from_name); in CIFSSMBRename()
2194 name_len2 = copy_path_name(pSMB->OldFileName+name_len+1, to_name); in CIFSSMBRename()
2195 pSMB->OldFileName[name_len] = 0x04; /* 2nd buffer format */ in CIFSSMBRename()
2201 pSMB->ByteCount = cpu_to_le16(count); in CIFSSMBRename()
2203 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBRename()
2205 cifs_stats_inc(&tcon->stats.cifs_stats.num_renames); in CIFSSMBRename()
2211 if (rc == -EAGAIN) in CIFSSMBRename()
2238 pSMB->MaxSetupCount = 0; in CIFSSMBRenameOpenFile()
2239 pSMB->Reserved = 0; in CIFSSMBRenameOpenFile()
2240 pSMB->Flags = 0; in CIFSSMBRenameOpenFile()
2241 pSMB->Timeout = 0; in CIFSSMBRenameOpenFile()
2242 pSMB->Reserved2 = 0; in CIFSSMBRenameOpenFile()
2243 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBRenameOpenFile()
2249 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBRenameOpenFile()
2250 pSMB->MaxDataCount = cpu_to_le16(1000); /* BB find max SMB from sess */ in CIFSSMBRenameOpenFile()
2251 pSMB->SetupCount = 1; in CIFSSMBRenameOpenFile()
2252 pSMB->Reserved3 = 0; in CIFSSMBRenameOpenFile()
2253 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBRenameOpenFile()
2255 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBRenameOpenFile()
2256 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBRenameOpenFile()
2257 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBRenameOpenFile()
2258 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBRenameOpenFile()
2260 rename_info->overwrite = cpu_to_le32(1); in CIFSSMBRenameOpenFile()
2261 rename_info->root_fid = 0; in CIFSSMBRenameOpenFile()
2264 sprintf(dummy_string, "cifs%x", pSMB->hdr.Mid); in CIFSSMBRenameOpenFile()
2266 cifsConvertToUTF16((__le16 *)rename_info->target_name, in CIFSSMBRenameOpenFile()
2270 cifsConvertToUTF16((__le16 *)rename_info->target_name, in CIFSSMBRenameOpenFile()
2274 rename_info->target_name_len = cpu_to_le32(2 * len_of_str); in CIFSSMBRenameOpenFile()
2277 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBRenameOpenFile()
2278 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBRenameOpenFile()
2279 pSMB->Fid = netfid; in CIFSSMBRenameOpenFile()
2280 pSMB->InformationLevel = in CIFSSMBRenameOpenFile()
2282 pSMB->Reserved4 = 0; in CIFSSMBRenameOpenFile()
2284 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBRenameOpenFile()
2285 rc = SendReceive(xid, pTcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBRenameOpenFile()
2287 cifs_stats_inc(&pTcon->stats.cifs_stats.num_t2renames); in CIFSSMBRenameOpenFile()
2294 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBRenameOpenFile()
2319 pSMB->BufferFormat = 0x04; in CIFSSMBCopy()
2320 pSMB->Tid2 = target_tid; in CIFSSMBCopy()
2322 pSMB->Flags = cpu_to_le16(flags & COPY_TREE); in CIFSSMBCopy()
2324 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBCopy()
2325 name_len = cifsConvertToUTF16((__le16 *) pSMB->OldFileName, in CIFSSMBCopy()
2330 pSMB->OldFileName[name_len] = 0x04; /* pad */ in CIFSSMBCopy()
2332 pSMB->OldFileName[name_len + 1] = 0x00; in CIFSSMBCopy()
2334 cifsConvertToUTF16((__le16 *)&pSMB->OldFileName[name_len+2], in CIFSSMBCopy()
2339 name_len = copy_path_name(pSMB->OldFileName, fromName); in CIFSSMBCopy()
2340 pSMB->OldFileName[name_len] = 0x04; /* 2nd buffer format */ in CIFSSMBCopy()
2341 name_len2 = copy_path_name(pSMB->OldFileName+name_len+1, toName); in CIFSSMBCopy()
2347 pSMB->ByteCount = cpu_to_le16(count); in CIFSSMBCopy()
2349 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBCopy()
2353 rc, le16_to_cpu(pSMBr->CopyCount)); in CIFSSMBCopy()
2357 if (rc == -EAGAIN) in CIFSSMBCopy()
2384 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSUnixCreateSymLink()
2386 cifsConvertToUTF16((__le16 *) pSMB->FileName, fromName, in CIFSUnixCreateSymLink()
2393 name_len = copy_path_name(pSMB->FileName, fromName); in CIFSUnixCreateSymLink()
2396 pSMB->MaxSetupCount = 0; in CIFSUnixCreateSymLink()
2397 pSMB->Reserved = 0; in CIFSUnixCreateSymLink()
2398 pSMB->Flags = 0; in CIFSUnixCreateSymLink()
2399 pSMB->Timeout = 0; in CIFSUnixCreateSymLink()
2400 pSMB->Reserved2 = 0; in CIFSUnixCreateSymLink()
2402 InformationLevel) - 4; in CIFSUnixCreateSymLink()
2407 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSUnixCreateSymLink()
2418 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSUnixCreateSymLink()
2420 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSUnixCreateSymLink()
2421 pSMB->SetupCount = 1; in CIFSUnixCreateSymLink()
2422 pSMB->Reserved3 = 0; in CIFSUnixCreateSymLink()
2423 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSUnixCreateSymLink()
2425 pSMB->DataCount = cpu_to_le16(name_len_target); in CIFSUnixCreateSymLink()
2426 pSMB->ParameterCount = cpu_to_le16(params); in CIFSUnixCreateSymLink()
2427 pSMB->TotalDataCount = pSMB->DataCount; in CIFSUnixCreateSymLink()
2428 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSUnixCreateSymLink()
2429 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSUnixCreateSymLink()
2430 pSMB->DataOffset = cpu_to_le16(offset); in CIFSUnixCreateSymLink()
2431 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_UNIX_LINK); in CIFSUnixCreateSymLink()
2432 pSMB->Reserved4 = 0; in CIFSUnixCreateSymLink()
2434 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSUnixCreateSymLink()
2435 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSUnixCreateSymLink()
2437 cifs_stats_inc(&tcon->stats.cifs_stats.num_symlinks); in CIFSUnixCreateSymLink()
2444 if (rc == -EAGAIN) in CIFSUnixCreateSymLink()
2471 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSUnixCreateHardLink()
2472 name_len = cifsConvertToUTF16((__le16 *) pSMB->FileName, toName, in CIFSUnixCreateHardLink()
2478 name_len = copy_path_name(pSMB->FileName, toName); in CIFSUnixCreateHardLink()
2481 pSMB->MaxSetupCount = 0; in CIFSUnixCreateHardLink()
2482 pSMB->Reserved = 0; in CIFSUnixCreateHardLink()
2483 pSMB->Flags = 0; in CIFSUnixCreateHardLink()
2484 pSMB->Timeout = 0; in CIFSUnixCreateHardLink()
2485 pSMB->Reserved2 = 0; in CIFSUnixCreateHardLink()
2487 InformationLevel) - 4; in CIFSUnixCreateHardLink()
2492 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSUnixCreateHardLink()
2502 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSUnixCreateHardLink()
2504 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSUnixCreateHardLink()
2505 pSMB->SetupCount = 1; in CIFSUnixCreateHardLink()
2506 pSMB->Reserved3 = 0; in CIFSUnixCreateHardLink()
2507 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSUnixCreateHardLink()
2509 pSMB->ParameterCount = cpu_to_le16(params); in CIFSUnixCreateHardLink()
2510 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSUnixCreateHardLink()
2511 pSMB->DataCount = cpu_to_le16(name_len_target); in CIFSUnixCreateHardLink()
2512 pSMB->TotalDataCount = pSMB->DataCount; in CIFSUnixCreateHardLink()
2513 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSUnixCreateHardLink()
2514 pSMB->DataOffset = cpu_to_le16(offset); in CIFSUnixCreateHardLink()
2515 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_UNIX_HLINK); in CIFSUnixCreateHardLink()
2516 pSMB->Reserved4 = 0; in CIFSUnixCreateHardLink()
2518 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSUnixCreateHardLink()
2519 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSUnixCreateHardLink()
2521 cifs_stats_inc(&tcon->stats.cifs_stats.num_hardlinks); in CIFSUnixCreateHardLink()
2527 if (rc == -EAGAIN) in CIFSUnixCreateHardLink()
2555 pSMB->SearchAttributes = in CIFSCreateHardLink()
2558 pSMB->Flags = cpu_to_le16(CREATE_HARD_LINK); in CIFSCreateHardLink()
2559 pSMB->ClusterCount = 0; in CIFSCreateHardLink()
2561 pSMB->BufferFormat = 0x04; in CIFSCreateHardLink()
2563 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSCreateHardLink()
2565 cifsConvertToUTF16((__le16 *) pSMB->OldFileName, from_name, in CIFSCreateHardLink()
2566 PATH_MAX, cifs_sb->local_nls, remap); in CIFSCreateHardLink()
2571 pSMB->OldFileName[name_len] = 0x04; in CIFSCreateHardLink()
2572 pSMB->OldFileName[name_len + 1] = 0x00; /* pad */ in CIFSCreateHardLink()
2574 cifsConvertToUTF16((__le16 *)&pSMB->OldFileName[name_len+2], in CIFSCreateHardLink()
2575 to_name, PATH_MAX, cifs_sb->local_nls, in CIFSCreateHardLink()
2580 name_len = copy_path_name(pSMB->OldFileName, from_name); in CIFSCreateHardLink()
2581 pSMB->OldFileName[name_len] = 0x04; /* 2nd buffer format */ in CIFSCreateHardLink()
2582 name_len2 = copy_path_name(pSMB->OldFileName+name_len+1, to_name); in CIFSCreateHardLink()
2588 pSMB->ByteCount = cpu_to_le16(count); in CIFSCreateHardLink()
2590 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSCreateHardLink()
2592 cifs_stats_inc(&tcon->stats.cifs_stats.num_hardlinks); in CIFSCreateHardLink()
2597 if (rc == -EAGAIN) in CIFSCreateHardLink()
2625 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBUnixQuerySymLink()
2627 cifsConvertToUTF16((__le16 *) pSMB->FileName, in CIFSSMBUnixQuerySymLink()
2633 name_len = copy_path_name(pSMB->FileName, searchName); in CIFSSMBUnixQuerySymLink()
2637 pSMB->TotalDataCount = 0; in CIFSSMBUnixQuerySymLink()
2638 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBUnixQuerySymLink()
2639 pSMB->MaxDataCount = cpu_to_le16(CIFSMaxBufSize); in CIFSSMBUnixQuerySymLink()
2640 pSMB->MaxSetupCount = 0; in CIFSSMBUnixQuerySymLink()
2641 pSMB->Reserved = 0; in CIFSSMBUnixQuerySymLink()
2642 pSMB->Flags = 0; in CIFSSMBUnixQuerySymLink()
2643 pSMB->Timeout = 0; in CIFSSMBUnixQuerySymLink()
2644 pSMB->Reserved2 = 0; in CIFSSMBUnixQuerySymLink()
2645 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBUnixQuerySymLink()
2646 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSSMBUnixQuerySymLink()
2647 pSMB->DataCount = 0; in CIFSSMBUnixQuerySymLink()
2648 pSMB->DataOffset = 0; in CIFSSMBUnixQuerySymLink()
2649 pSMB->SetupCount = 1; in CIFSSMBUnixQuerySymLink()
2650 pSMB->Reserved3 = 0; in CIFSSMBUnixQuerySymLink()
2651 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSSMBUnixQuerySymLink()
2653 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBUnixQuerySymLink()
2654 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBUnixQuerySymLink()
2655 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_UNIX_LINK); in CIFSSMBUnixQuerySymLink()
2656 pSMB->Reserved4 = 0; in CIFSSMBUnixQuerySymLink()
2658 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixQuerySymLink()
2660 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBUnixQuerySymLink()
2669 if (rc || get_bcc(&pSMBr->hdr) < 2) in CIFSSMBUnixQuerySymLink()
2670 rc = -EIO; in CIFSSMBUnixQuerySymLink()
2673 u16 count = le16_to_cpu(pSMBr->t2.DataCount); in CIFSSMBUnixQuerySymLink()
2675 data_start = ((char *) &pSMBr->hdr.Protocol) + in CIFSSMBUnixQuerySymLink()
2676 le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBUnixQuerySymLink()
2678 if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) in CIFSSMBUnixQuerySymLink()
2687 rc = -ENOMEM; in CIFSSMBUnixQuerySymLink()
2691 if (rc == -EAGAIN) in CIFSSMBUnixQuerySymLink()
2715 if (cap_unix(tcon->ses)) in cifs_query_reparse_point()
2716 return -EOPNOTSUPP; in cifs_query_reparse_point()
2738 io_req->TotalParameterCount = 0; in cifs_query_reparse_point()
2739 io_req->TotalDataCount = 0; in cifs_query_reparse_point()
2740 io_req->MaxParameterCount = cpu_to_le32(2); in cifs_query_reparse_point()
2742 io_req->MaxDataCount = cpu_to_le32(CIFSMaxBufSize & 0xFFFFFF00); in cifs_query_reparse_point()
2743 io_req->MaxSetupCount = 4; in cifs_query_reparse_point()
2744 io_req->Reserved = 0; in cifs_query_reparse_point()
2745 io_req->ParameterOffset = 0; in cifs_query_reparse_point()
2746 io_req->DataCount = 0; in cifs_query_reparse_point()
2747 io_req->DataOffset = 0; in cifs_query_reparse_point()
2748 io_req->SetupCount = 4; in cifs_query_reparse_point()
2749 io_req->SubCommand = cpu_to_le16(NT_TRANSACT_IOCTL); in cifs_query_reparse_point()
2750 io_req->ParameterCount = io_req->TotalParameterCount; in cifs_query_reparse_point()
2751 io_req->FunctionCode = cpu_to_le32(FSCTL_GET_REPARSE_POINT); in cifs_query_reparse_point()
2752 io_req->IsFsctl = 1; in cifs_query_reparse_point()
2753 io_req->IsRootFlag = 0; in cifs_query_reparse_point()
2754 io_req->Fid = fid.netfid; in cifs_query_reparse_point()
2755 io_req->ByteCount = 0; in cifs_query_reparse_point()
2757 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *)io_req, in cifs_query_reparse_point()
2762 data_offset = le32_to_cpu(io_rsp->DataOffset); in cifs_query_reparse_point()
2763 data_count = le32_to_cpu(io_rsp->DataCount); in cifs_query_reparse_point()
2764 if (get_bcc(&io_rsp->hdr) < 2 || data_offset > 512 || in cifs_query_reparse_point()
2766 rc = -EIO; in cifs_query_reparse_point()
2770 end = 2 + get_bcc(&io_rsp->hdr) + (__u8 *)&io_rsp->ByteCount; in cifs_query_reparse_point()
2771 start = (__u8 *)&io_rsp->hdr.Protocol + data_offset; in cifs_query_reparse_point()
2773 rc = -EIO; in cifs_query_reparse_point()
2777 *tag = le32_to_cpu(((struct reparse_data_buffer *)start)->ReparseTag); in cifs_query_reparse_point()
2778 rsp->iov_base = io_rsp; in cifs_query_reparse_point()
2779 rsp->iov_len = io_rsp_len; in cifs_query_reparse_point()
2799 cifs_dbg(FYI, "Set compression for %u\n", fid); in CIFSSMB_set_compression()
2805 pSMB->compression_state = cpu_to_le16(COMPRESSION_FORMAT_DEFAULT); in CIFSSMB_set_compression()
2807 pSMB->TotalParameterCount = 0; in CIFSSMB_set_compression()
2808 pSMB->TotalDataCount = cpu_to_le32(2); in CIFSSMB_set_compression()
2809 pSMB->MaxParameterCount = 0; in CIFSSMB_set_compression()
2810 pSMB->MaxDataCount = 0; in CIFSSMB_set_compression()
2811 pSMB->MaxSetupCount = 4; in CIFSSMB_set_compression()
2812 pSMB->Reserved = 0; in CIFSSMB_set_compression()
2813 pSMB->ParameterOffset = 0; in CIFSSMB_set_compression()
2814 pSMB->DataCount = cpu_to_le32(2); in CIFSSMB_set_compression()
2815 pSMB->DataOffset = in CIFSSMB_set_compression()
2817 compression_state) - 4); /* 84 */ in CIFSSMB_set_compression()
2818 pSMB->SetupCount = 4; in CIFSSMB_set_compression()
2819 pSMB->SubCommand = cpu_to_le16(NT_TRANSACT_IOCTL); in CIFSSMB_set_compression()
2820 pSMB->ParameterCount = 0; in CIFSSMB_set_compression()
2821 pSMB->FunctionCode = cpu_to_le32(FSCTL_SET_COMPRESSION); in CIFSSMB_set_compression()
2822 pSMB->IsFsctl = 1; /* FSCTL */ in CIFSSMB_set_compression()
2823 pSMB->IsRootFlag = 0; in CIFSSMB_set_compression()
2824 pSMB->Fid = fid; /* file handle always le */ in CIFSSMB_set_compression()
2826 pSMB->ByteCount = cpu_to_le16(5); in CIFSSMB_set_compression()
2829 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMB_set_compression()
2837 * Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMB_set_compression()
2848 * cifs_init_posix_acl - convert ACL from cifs to POSIX ACL format
2861 ace->e_perm = cifs_ace->cifs_e_perm; in cifs_init_posix_acl()
2862 ace->e_tag = cifs_ace->cifs_e_tag; in cifs_init_posix_acl()
2864 switch (ace->e_tag) { in cifs_init_posix_acl()
2866 ace->e_uid = make_kuid(&init_user_ns, in cifs_init_posix_acl()
2867 le64_to_cpu(cifs_ace->cifs_uid)); in cifs_init_posix_acl()
2870 ace->e_gid = make_kgid(&init_user_ns, in cifs_init_posix_acl()
2871 le64_to_cpu(cifs_ace->cifs_uid)); in cifs_init_posix_acl()
2878 * cifs_to_posix_acl - copy cifs ACL format to POSIX ACL format
2898 if (le16_to_cpu(cifs_acl->version) != CIFS_ACL_VERSION) in cifs_to_posix_acl()
2899 return -EOPNOTSUPP; in cifs_to_posix_acl()
2902 count = le16_to_cpu(cifs_acl->access_entry_count); in cifs_to_posix_acl()
2903 pACE = &cifs_acl->ace_array[0]; in cifs_to_posix_acl()
2910 return -EINVAL; in cifs_to_posix_acl()
2913 count = le16_to_cpu(cifs_acl->access_entry_count); in cifs_to_posix_acl()
2916 /* skip past access ACEs to get to default ACEs */ in cifs_to_posix_acl()
2917 pACE = &cifs_acl->ace_array[count]; in cifs_to_posix_acl()
2918 count = le16_to_cpu(cifs_acl->default_entry_count); in cifs_to_posix_acl()
2922 return -EINVAL; in cifs_to_posix_acl()
2925 return -EINVAL; in cifs_to_posix_acl()
2931 return -ENOMEM; in cifs_to_posix_acl()
2943 * cifs_init_ace - convert ACL entry from POSIX ACL to cifs format
2950 cifs_ace->cifs_e_perm = local_ace->e_perm; in cifs_init_ace()
2951 cifs_ace->cifs_e_tag = local_ace->e_tag; in cifs_init_ace()
2953 switch (local_ace->e_tag) { in cifs_init_ace()
2955 cifs_ace->cifs_uid = in cifs_init_ace()
2956 cpu_to_le64(from_kuid(&init_user_ns, local_ace->e_uid)); in cifs_init_ace()
2959 cifs_ace->cifs_uid = in cifs_init_ace()
2960 cpu_to_le64(from_kgid(&init_user_ns, local_ace->e_gid)); in cifs_init_ace()
2963 cifs_ace->cifs_uid = cpu_to_le64(-1); in cifs_init_ace()
2968 * posix_acl_to_cifs - convert ACLs from POSIX ACL to cifs format
2987 count = acl->a_count; in posix_acl_to_cifs()
2997 cifs_acl->version = cpu_to_le16(1); in posix_acl_to_cifs()
2999 cifs_acl->access_entry_count = cpu_to_le16(count); in posix_acl_to_cifs()
3000 cifs_acl->default_entry_count = cpu_to_le16(0xFFFF); in posix_acl_to_cifs()
3002 cifs_acl->default_entry_count = cpu_to_le16(count); in posix_acl_to_cifs()
3003 cifs_acl->access_entry_count = cpu_to_le16(0xFFFF); in posix_acl_to_cifs()
3009 cifs_init_ace(&cifs_acl->ace_array[i++], pa); in posix_acl_to_cifs()
3040 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in cifs_do_get_acl()
3042 cifsConvertToUTF16((__le16 *) pSMB->FileName, in cifs_do_get_acl()
3047 pSMB->FileName[name_len] = 0; in cifs_do_get_acl()
3048 pSMB->FileName[name_len+1] = 0; in cifs_do_get_acl()
3050 name_len = copy_path_name(pSMB->FileName, searchName); in cifs_do_get_acl()
3054 pSMB->TotalDataCount = 0; in cifs_do_get_acl()
3055 pSMB->MaxParameterCount = cpu_to_le16(2); in cifs_do_get_acl()
3057 pSMB->MaxDataCount = cpu_to_le16(4000); in cifs_do_get_acl()
3058 pSMB->MaxSetupCount = 0; in cifs_do_get_acl()
3059 pSMB->Reserved = 0; in cifs_do_get_acl()
3060 pSMB->Flags = 0; in cifs_do_get_acl()
3061 pSMB->Timeout = 0; in cifs_do_get_acl()
3062 pSMB->Reserved2 = 0; in cifs_do_get_acl()
3063 pSMB->ParameterOffset = cpu_to_le16( in cifs_do_get_acl()
3065 InformationLevel) - 4); in cifs_do_get_acl()
3066 pSMB->DataCount = 0; in cifs_do_get_acl()
3067 pSMB->DataOffset = 0; in cifs_do_get_acl()
3068 pSMB->SetupCount = 1; in cifs_do_get_acl()
3069 pSMB->Reserved3 = 0; in cifs_do_get_acl()
3070 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in cifs_do_get_acl()
3072 pSMB->TotalParameterCount = cpu_to_le16(params); in cifs_do_get_acl()
3073 pSMB->ParameterCount = pSMB->TotalParameterCount; in cifs_do_get_acl()
3074 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_POSIX_ACL); in cifs_do_get_acl()
3075 pSMB->Reserved4 = 0; in cifs_do_get_acl()
3077 pSMB->ByteCount = cpu_to_le16(byte_count); in cifs_do_get_acl()
3079 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in cifs_do_get_acl()
3081 cifs_stats_inc(&tcon->stats.cifs_stats.num_acl_get); in cifs_do_get_acl()
3089 if (rc || get_bcc(&pSMBr->hdr) < 2) in cifs_do_get_acl()
3090 rc = -EIO; /* bad smb */ in cifs_do_get_acl()
3092 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in cifs_do_get_acl()
3093 __u16 count = le16_to_cpu(pSMBr->t2.DataCount); in cifs_do_get_acl()
3095 (char *)&pSMBr->hdr.Protocol+data_offset, in cifs_do_get_acl()
3105 if (rc == -EAGAIN) in cifs_do_get_acl()
3129 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in cifs_do_set_acl()
3131 cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, in cifs_do_set_acl()
3136 name_len = copy_path_name(pSMB->FileName, fileName); in cifs_do_set_acl()
3139 pSMB->MaxParameterCount = cpu_to_le16(2); in cifs_do_set_acl()
3141 pSMB->MaxDataCount = cpu_to_le16(1000); in cifs_do_set_acl()
3142 pSMB->MaxSetupCount = 0; in cifs_do_set_acl()
3143 pSMB->Reserved = 0; in cifs_do_set_acl()
3144 pSMB->Flags = 0; in cifs_do_set_acl()
3145 pSMB->Timeout = 0; in cifs_do_set_acl()
3146 pSMB->Reserved2 = 0; in cifs_do_set_acl()
3148 InformationLevel) - 4; in cifs_do_set_acl()
3150 parm_data = ((char *)pSMB) + sizeof(pSMB->hdr.smb_buf_length) + offset; in cifs_do_set_acl()
3151 pSMB->ParameterOffset = cpu_to_le16(param_offset); in cifs_do_set_acl()
3157 rc = -EOPNOTSUPP; in cifs_do_set_acl()
3160 pSMB->DataOffset = cpu_to_le16(offset); in cifs_do_set_acl()
3161 pSMB->SetupCount = 1; in cifs_do_set_acl()
3162 pSMB->Reserved3 = 0; in cifs_do_set_acl()
3163 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in cifs_do_set_acl()
3164 pSMB->InformationLevel = cpu_to_le16(SMB_SET_POSIX_ACL); in cifs_do_set_acl()
3166 pSMB->DataCount = cpu_to_le16(data_count); in cifs_do_set_acl()
3167 pSMB->TotalDataCount = pSMB->DataCount; in cifs_do_set_acl()
3168 pSMB->ParameterCount = cpu_to_le16(params); in cifs_do_set_acl()
3169 pSMB->TotalParameterCount = pSMB->ParameterCount; in cifs_do_set_acl()
3170 pSMB->Reserved4 = 0; in cifs_do_set_acl()
3172 pSMB->ByteCount = cpu_to_le16(byte_count); in cifs_do_set_acl()
3173 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in cifs_do_set_acl()
3176 cifs_dbg(FYI, "Set POSIX ACL returned %d\n", rc); in cifs_do_set_acl()
3180 if (rc == -EAGAIN) in cifs_do_set_acl()
3190 return -EOPNOTSUPP; in cifs_do_get_acl()
3198 return -EOPNOTSUPP; in cifs_do_set_acl()
3214 return -ENODEV; in CIFSGetExtAttr()
3223 pSMB->t2.TotalDataCount = 0; in CIFSGetExtAttr()
3224 pSMB->t2.MaxParameterCount = cpu_to_le16(4); in CIFSGetExtAttr()
3226 pSMB->t2.MaxDataCount = cpu_to_le16(4000); in CIFSGetExtAttr()
3227 pSMB->t2.MaxSetupCount = 0; in CIFSGetExtAttr()
3228 pSMB->t2.Reserved = 0; in CIFSGetExtAttr()
3229 pSMB->t2.Flags = 0; in CIFSGetExtAttr()
3230 pSMB->t2.Timeout = 0; in CIFSGetExtAttr()
3231 pSMB->t2.Reserved2 = 0; in CIFSGetExtAttr()
3232 pSMB->t2.ParameterOffset = cpu_to_le16(offsetof(struct smb_t2_qfi_req, in CIFSGetExtAttr()
3233 Fid) - 4); in CIFSGetExtAttr()
3234 pSMB->t2.DataCount = 0; in CIFSGetExtAttr()
3235 pSMB->t2.DataOffset = 0; in CIFSGetExtAttr()
3236 pSMB->t2.SetupCount = 1; in CIFSGetExtAttr()
3237 pSMB->t2.Reserved3 = 0; in CIFSGetExtAttr()
3238 pSMB->t2.SubCommand = cpu_to_le16(TRANS2_QUERY_FILE_INFORMATION); in CIFSGetExtAttr()
3240 pSMB->t2.TotalParameterCount = cpu_to_le16(params); in CIFSGetExtAttr()
3241 pSMB->t2.ParameterCount = pSMB->t2.TotalParameterCount; in CIFSGetExtAttr()
3242 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_ATTR_FLAGS); in CIFSGetExtAttr()
3243 pSMB->Pad = 0; in CIFSGetExtAttr()
3244 pSMB->Fid = netfid; in CIFSGetExtAttr()
3246 pSMB->t2.ByteCount = cpu_to_le16(byte_count); in CIFSGetExtAttr()
3248 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSGetExtAttr()
3256 if (rc || get_bcc(&pSMBr->hdr) < 2) in CIFSGetExtAttr()
3259 rc = -EIO; /* bad smb */ in CIFSGetExtAttr()
3261 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSGetExtAttr()
3262 __u16 count = le16_to_cpu(pSMBr->t2.DataCount); in CIFSGetExtAttr()
3267 rc = -EIO; in CIFSGetExtAttr()
3271 (data_offset + (char *) &pSMBr->hdr.Protocol); in CIFSGetExtAttr()
3272 *pExtAttrBits = le64_to_cpu(pfinfo->mode); in CIFSGetExtAttr()
3273 *pMask = le64_to_cpu(pfinfo->mask); in CIFSGetExtAttr()
3278 if (rc == -EAGAIN) in CIFSGetExtAttr()
3290 * returned setup area) and MaxParameterCount (returned parms size) must be set
3307 pSMB->Reserved = 0; in smb_init_nttransact()
3308 pSMB->TotalParameterCount = cpu_to_le32(parm_len); in smb_init_nttransact()
3309 pSMB->TotalDataCount = 0; in smb_init_nttransact()
3310 pSMB->MaxDataCount = cpu_to_le32(CIFSMaxBufSize & 0xFFFFFF00); in smb_init_nttransact()
3311 pSMB->ParameterCount = pSMB->TotalParameterCount; in smb_init_nttransact()
3312 pSMB->DataCount = pSMB->TotalDataCount; in smb_init_nttransact()
3314 (setup_count * 2) - 4 /* for rfc1001 length itself */; in smb_init_nttransact()
3315 pSMB->ParameterOffset = cpu_to_le32(temp_offset); in smb_init_nttransact()
3316 pSMB->DataOffset = cpu_to_le32(temp_offset + parm_len); in smb_init_nttransact()
3317 pSMB->SetupCount = setup_count; /* no need to le convert byte fields */ in smb_init_nttransact()
3318 pSMB->SubCommand = cpu_to_le16(sub_command); in smb_init_nttransact()
3335 return -EINVAL; in validate_ntransact()
3339 bcc = get_bcc(&pSMBr->hdr); in validate_ntransact()
3341 (char *)&pSMBr->ByteCount; in validate_ntransact()
3343 data_offset = le32_to_cpu(pSMBr->DataOffset); in validate_ntransact()
3344 data_count = le32_to_cpu(pSMBr->DataCount); in validate_ntransact()
3345 parm_offset = le32_to_cpu(pSMBr->ParameterOffset); in validate_ntransact()
3346 parm_count = le32_to_cpu(pSMBr->ParameterCount); in validate_ntransact()
3348 *ppparm = (char *)&pSMBr->hdr.Protocol + parm_offset; in validate_ntransact()
3349 *ppdata = (char *)&pSMBr->hdr.Protocol + data_offset; in validate_ntransact()
3354 return -EINVAL; in validate_ntransact()
3357 return -EINVAL; in validate_ntransact()
3360 return -EINVAL; in validate_ntransact()
3365 return -EINVAL; in validate_ntransact()
3368 return -EINVAL; in validate_ntransact()
3396 pSMB->MaxParameterCount = cpu_to_le32(4); in CIFSSMBGetCIFSACL()
3398 pSMB->MaxSetupCount = 0; in CIFSSMBGetCIFSACL()
3399 pSMB->Fid = fid; /* file handle always le */ in CIFSSMBGetCIFSACL()
3400 pSMB->AclFlags = cpu_to_le32(CIFS_ACL_OWNER | CIFS_ACL_GROUP | in CIFSSMBGetCIFSACL()
3402 pSMB->ByteCount = cpu_to_le16(11); /* 3 bytes pad + 8 bytes parm */ in CIFSSMBGetCIFSACL()
3405 iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4; in CIFSSMBGetCIFSACL()
3407 rc = SendReceive2(xid, tcon->ses, iov, 1 /* num iovec */, &buf_type, in CIFSSMBGetCIFSACL()
3410 cifs_stats_inc(&tcon->stats.cifs_stats.num_acl_get); in CIFSSMBGetCIFSACL()
3430 if (le32_to_cpu(pSMBr->ParameterCount) != 4) { in CIFSSMBGetCIFSACL()
3431 rc = -EIO; /* bad smb */ in CIFSSMBGetCIFSACL()
3451 rc = -EINVAL; in CIFSSMBGetCIFSACL()
3457 rc = -ENOMEM; in CIFSSMBGetCIFSACL()
3481 pSMB->MaxSetupCount = 0; in CIFSSMBSetCIFSACL()
3482 pSMB->Reserved = 0; in CIFSSMBSetCIFSACL()
3485 param_offset = offsetof(struct smb_com_transaction_ssec_req, Fid) - 4; in CIFSSMBSetCIFSACL()
3490 pSMB->DataCount = cpu_to_le32(data_count); in CIFSSMBSetCIFSACL()
3491 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetCIFSACL()
3492 pSMB->MaxParameterCount = cpu_to_le32(4); in CIFSSMBSetCIFSACL()
3493 pSMB->MaxDataCount = cpu_to_le32(16384); in CIFSSMBSetCIFSACL()
3494 pSMB->ParameterCount = cpu_to_le32(param_count); in CIFSSMBSetCIFSACL()
3495 pSMB->ParameterOffset = cpu_to_le32(param_offset); in CIFSSMBSetCIFSACL()
3496 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetCIFSACL()
3497 pSMB->DataOffset = cpu_to_le32(data_offset); in CIFSSMBSetCIFSACL()
3498 pSMB->SetupCount = 0; in CIFSSMBSetCIFSACL()
3499 pSMB->SubCommand = cpu_to_le16(NT_TRANSACT_SET_SECURITY_DESC); in CIFSSMBSetCIFSACL()
3500 pSMB->ByteCount = cpu_to_le16(byte_count+data_count); in CIFSSMBSetCIFSACL()
3502 pSMB->Fid = fid; /* file handle always le */ in CIFSSMBSetCIFSACL()
3503 pSMB->Reserved2 = 0; in CIFSSMBSetCIFSACL()
3504 pSMB->AclFlags = cpu_to_le32(aclflag); in CIFSSMBSetCIFSACL()
3513 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetCIFSACL()
3519 cifs_dbg(FYI, "Set CIFS ACL returned %d\n", rc); in CIFSSMBSetCIFSACL()
3522 if (rc == -EAGAIN) in CIFSSMBSetCIFSACL()
3549 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in SMBQueryInformation()
3551 cifsConvertToUTF16((__le16 *) pSMB->FileName, in SMBQueryInformation()
3557 name_len = copy_path_name(pSMB->FileName, search_name); in SMBQueryInformation()
3559 pSMB->BufferFormat = 0x04; in SMBQueryInformation()
3562 pSMB->ByteCount = cpu_to_le16(name_len); in SMBQueryInformation()
3564 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in SMBQueryInformation()
3570 __u32 time = le32_to_cpu(pSMBr->last_write_time); in SMBQueryInformation()
3573 /* BB FIXME - add time zone adjustment BB */ in SMBQueryInformation()
3578 data->ChangeTime = cpu_to_le64(cifs_UnixTimeToNT(ts)); in SMBQueryInformation()
3579 data->LastWriteTime = data->ChangeTime; in SMBQueryInformation()
3580 data->LastAccessTime = 0; in SMBQueryInformation()
3581 data->AllocationSize = in SMBQueryInformation()
3582 cpu_to_le64(le32_to_cpu(pSMBr->size)); in SMBQueryInformation()
3583 data->EndOfFile = data->AllocationSize; in SMBQueryInformation()
3584 data->Attributes = in SMBQueryInformation()
3585 cpu_to_le32(le16_to_cpu(pSMBr->attr)); in SMBQueryInformation()
3587 rc = -EIO; /* bad buffer passed in */ in SMBQueryInformation()
3591 if (rc == -EAGAIN) in SMBQueryInformation()
3614 pSMB->t2.TotalDataCount = 0; in CIFSSMBQFileInfo()
3615 pSMB->t2.MaxParameterCount = cpu_to_le16(4); in CIFSSMBQFileInfo()
3617 pSMB->t2.MaxDataCount = cpu_to_le16(CIFSMaxBufSize); in CIFSSMBQFileInfo()
3618 pSMB->t2.MaxSetupCount = 0; in CIFSSMBQFileInfo()
3619 pSMB->t2.Reserved = 0; in CIFSSMBQFileInfo()
3620 pSMB->t2.Flags = 0; in CIFSSMBQFileInfo()
3621 pSMB->t2.Timeout = 0; in CIFSSMBQFileInfo()
3622 pSMB->t2.Reserved2 = 0; in CIFSSMBQFileInfo()
3623 pSMB->t2.ParameterOffset = cpu_to_le16(offsetof(struct smb_t2_qfi_req, in CIFSSMBQFileInfo()
3624 Fid) - 4); in CIFSSMBQFileInfo()
3625 pSMB->t2.DataCount = 0; in CIFSSMBQFileInfo()
3626 pSMB->t2.DataOffset = 0; in CIFSSMBQFileInfo()
3627 pSMB->t2.SetupCount = 1; in CIFSSMBQFileInfo()
3628 pSMB->t2.Reserved3 = 0; in CIFSSMBQFileInfo()
3629 pSMB->t2.SubCommand = cpu_to_le16(TRANS2_QUERY_FILE_INFORMATION); in CIFSSMBQFileInfo()
3631 pSMB->t2.TotalParameterCount = cpu_to_le16(params); in CIFSSMBQFileInfo()
3632 pSMB->t2.ParameterCount = pSMB->t2.TotalParameterCount; in CIFSSMBQFileInfo()
3633 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_ALL_INFO); in CIFSSMBQFileInfo()
3634 pSMB->Pad = 0; in CIFSSMBQFileInfo()
3635 pSMB->Fid = netfid; in CIFSSMBQFileInfo()
3637 pSMB->t2.ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFileInfo()
3639 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFileInfo()
3647 rc = -EIO; in CIFSSMBQFileInfo()
3648 else if (get_bcc(&pSMBr->hdr) < 40) in CIFSSMBQFileInfo()
3649 rc = -EIO; /* bad smb */ in CIFSSMBQFileInfo()
3651 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFileInfo()
3653 (char *) &pSMBr->hdr.Protocol + in CIFSSMBQFileInfo()
3656 rc = -ENOMEM; in CIFSSMBQFileInfo()
3659 if (rc == -EAGAIN) in CIFSSMBQFileInfo()
3686 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBQPathInfo()
3688 cifsConvertToUTF16((__le16 *) pSMB->FileName, search_name, in CIFSSMBQPathInfo()
3693 name_len = copy_path_name(pSMB->FileName, search_name); in CIFSSMBQPathInfo()
3697 pSMB->TotalDataCount = 0; in CIFSSMBQPathInfo()
3698 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQPathInfo()
3700 pSMB->MaxDataCount = cpu_to_le16(4000); in CIFSSMBQPathInfo()
3701 pSMB->MaxSetupCount = 0; in CIFSSMBQPathInfo()
3702 pSMB->Reserved = 0; in CIFSSMBQPathInfo()
3703 pSMB->Flags = 0; in CIFSSMBQPathInfo()
3704 pSMB->Timeout = 0; in CIFSSMBQPathInfo()
3705 pSMB->Reserved2 = 0; in CIFSSMBQPathInfo()
3706 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQPathInfo()
3707 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSSMBQPathInfo()
3708 pSMB->DataCount = 0; in CIFSSMBQPathInfo()
3709 pSMB->DataOffset = 0; in CIFSSMBQPathInfo()
3710 pSMB->SetupCount = 1; in CIFSSMBQPathInfo()
3711 pSMB->Reserved3 = 0; in CIFSSMBQPathInfo()
3712 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSSMBQPathInfo()
3714 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQPathInfo()
3715 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQPathInfo()
3717 pSMB->InformationLevel = cpu_to_le16(SMB_INFO_STANDARD); in CIFSSMBQPathInfo()
3719 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_ALL_INFO); in CIFSSMBQPathInfo()
3720 pSMB->Reserved4 = 0; in CIFSSMBQPathInfo()
3722 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQPathInfo()
3724 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQPathInfo()
3732 rc = -EIO; in CIFSSMBQPathInfo()
3733 else if (!legacy && get_bcc(&pSMBr->hdr) < 40) in CIFSSMBQPathInfo()
3734 rc = -EIO; /* bad smb */ in CIFSSMBQPathInfo()
3735 else if (legacy && get_bcc(&pSMBr->hdr) < 24) in CIFSSMBQPathInfo()
3736 rc = -EIO; /* 24 or 26 expected but we do not read in CIFSSMBQPathInfo()
3740 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQPathInfo()
3745 * also note it differs on Set vs Get, ie two bytes or 4 in CIFSSMBQPathInfo()
3752 memcpy((char *) data, (char *) &pSMBr->hdr.Protocol + in CIFSSMBQPathInfo()
3755 rc = -ENOMEM; in CIFSSMBQPathInfo()
3758 if (rc == -EAGAIN) in CIFSSMBQPathInfo()
3781 pSMB->t2.TotalDataCount = 0; in CIFSSMBUnixQFileInfo()
3782 pSMB->t2.MaxParameterCount = cpu_to_le16(4); in CIFSSMBUnixQFileInfo()
3784 pSMB->t2.MaxDataCount = cpu_to_le16(CIFSMaxBufSize); in CIFSSMBUnixQFileInfo()
3785 pSMB->t2.MaxSetupCount = 0; in CIFSSMBUnixQFileInfo()
3786 pSMB->t2.Reserved = 0; in CIFSSMBUnixQFileInfo()
3787 pSMB->t2.Flags = 0; in CIFSSMBUnixQFileInfo()
3788 pSMB->t2.Timeout = 0; in CIFSSMBUnixQFileInfo()
3789 pSMB->t2.Reserved2 = 0; in CIFSSMBUnixQFileInfo()
3790 pSMB->t2.ParameterOffset = cpu_to_le16(offsetof(struct smb_t2_qfi_req, in CIFSSMBUnixQFileInfo()
3791 Fid) - 4); in CIFSSMBUnixQFileInfo()
3792 pSMB->t2.DataCount = 0; in CIFSSMBUnixQFileInfo()
3793 pSMB->t2.DataOffset = 0; in CIFSSMBUnixQFileInfo()
3794 pSMB->t2.SetupCount = 1; in CIFSSMBUnixQFileInfo()
3795 pSMB->t2.Reserved3 = 0; in CIFSSMBUnixQFileInfo()
3796 pSMB->t2.SubCommand = cpu_to_le16(TRANS2_QUERY_FILE_INFORMATION); in CIFSSMBUnixQFileInfo()
3798 pSMB->t2.TotalParameterCount = cpu_to_le16(params); in CIFSSMBUnixQFileInfo()
3799 pSMB->t2.ParameterCount = pSMB->t2.TotalParameterCount; in CIFSSMBUnixQFileInfo()
3800 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC); in CIFSSMBUnixQFileInfo()
3801 pSMB->Pad = 0; in CIFSSMBUnixQFileInfo()
3802 pSMB->Fid = netfid; in CIFSSMBUnixQFileInfo()
3804 pSMB->t2.ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixQFileInfo()
3806 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBUnixQFileInfo()
3813 if (rc || get_bcc(&pSMBr->hdr) < sizeof(FILE_UNIX_BASIC_INFO)) { in CIFSSMBUnixQFileInfo()
3815 rc = -EIO; /* bad smb */ in CIFSSMBUnixQFileInfo()
3817 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBUnixQFileInfo()
3819 (char *) &pSMBr->hdr.Protocol + in CIFSSMBUnixQFileInfo()
3826 if (rc == -EAGAIN) in CIFSSMBUnixQFileInfo()
3853 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBUnixQPathInfo()
3855 cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, in CIFSSMBUnixQPathInfo()
3860 name_len = copy_path_name(pSMB->FileName, searchName); in CIFSSMBUnixQPathInfo()
3864 pSMB->TotalDataCount = 0; in CIFSSMBUnixQPathInfo()
3865 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBUnixQPathInfo()
3867 pSMB->MaxDataCount = cpu_to_le16(4000); in CIFSSMBUnixQPathInfo()
3868 pSMB->MaxSetupCount = 0; in CIFSSMBUnixQPathInfo()
3869 pSMB->Reserved = 0; in CIFSSMBUnixQPathInfo()
3870 pSMB->Flags = 0; in CIFSSMBUnixQPathInfo()
3871 pSMB->Timeout = 0; in CIFSSMBUnixQPathInfo()
3872 pSMB->Reserved2 = 0; in CIFSSMBUnixQPathInfo()
3873 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBUnixQPathInfo()
3874 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSSMBUnixQPathInfo()
3875 pSMB->DataCount = 0; in CIFSSMBUnixQPathInfo()
3876 pSMB->DataOffset = 0; in CIFSSMBUnixQPathInfo()
3877 pSMB->SetupCount = 1; in CIFSSMBUnixQPathInfo()
3878 pSMB->Reserved3 = 0; in CIFSSMBUnixQPathInfo()
3879 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSSMBUnixQPathInfo()
3881 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBUnixQPathInfo()
3882 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBUnixQPathInfo()
3883 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC); in CIFSSMBUnixQPathInfo()
3884 pSMB->Reserved4 = 0; in CIFSSMBUnixQPathInfo()
3886 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixQPathInfo()
3888 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBUnixQPathInfo()
3895 if (rc || get_bcc(&pSMBr->hdr) < sizeof(FILE_UNIX_BASIC_INFO)) { in CIFSSMBUnixQPathInfo()
3897 rc = -EIO; /* bad smb */ in CIFSSMBUnixQPathInfo()
3899 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBUnixQPathInfo()
3901 (char *) &pSMBr->hdr.Protocol + in CIFSSMBUnixQPathInfo()
3907 if (rc == -EAGAIN) in CIFSSMBUnixQPathInfo()
3939 nls_codepage = cifs_sb->local_nls; in CIFSFindFirst()
3942 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSFindFirst()
3944 cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, in CIFSFindFirst()
3951 pSMB->FileName[name_len] = CIFS_DIR_SEP(cifs_sb); in CIFSFindFirst()
3952 pSMB->FileName[name_len+1] = 0; in CIFSFindFirst()
3953 pSMB->FileName[name_len+2] = '*'; in CIFSFindFirst()
3954 pSMB->FileName[name_len+3] = 0; in CIFSFindFirst()
3957 pSMB->FileName[name_len] = 0; in CIFSFindFirst()
3958 pSMB->FileName[name_len+1] = 0; in CIFSFindFirst()
3962 name_len = copy_path_name(pSMB->FileName, searchName); in CIFSFindFirst()
3964 if (WARN_ON_ONCE(name_len > PATH_MAX-2)) in CIFSFindFirst()
3965 name_len = PATH_MAX-2; in CIFSFindFirst()
3967 pSMB->FileName[name_len-1] = CIFS_DIR_SEP(cifs_sb); in CIFSFindFirst()
3968 pSMB->FileName[name_len] = '*'; in CIFSFindFirst()
3969 pSMB->FileName[name_len+1] = 0; in CIFSFindFirst()
3975 pSMB->TotalDataCount = 0; /* no EAs */ in CIFSFindFirst()
3976 pSMB->MaxParameterCount = cpu_to_le16(10); in CIFSFindFirst()
3977 pSMB->MaxDataCount = cpu_to_le16(CIFSMaxBufSize & 0xFFFFFF00); in CIFSFindFirst()
3978 pSMB->MaxSetupCount = 0; in CIFSFindFirst()
3979 pSMB->Reserved = 0; in CIFSFindFirst()
3980 pSMB->Flags = 0; in CIFSFindFirst()
3981 pSMB->Timeout = 0; in CIFSFindFirst()
3982 pSMB->Reserved2 = 0; in CIFSFindFirst()
3984 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSFindFirst()
3985 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSFindFirst()
3986 pSMB->ParameterOffset = cpu_to_le16( in CIFSFindFirst()
3988 - 4); in CIFSFindFirst()
3989 pSMB->DataCount = 0; in CIFSFindFirst()
3990 pSMB->DataOffset = 0; in CIFSFindFirst()
3991 pSMB->SetupCount = 1; /* one byte, no need to make endian neutral */ in CIFSFindFirst()
3992 pSMB->Reserved3 = 0; in CIFSFindFirst()
3993 pSMB->SubCommand = cpu_to_le16(TRANS2_FIND_FIRST); in CIFSFindFirst()
3994 pSMB->SearchAttributes = in CIFSFindFirst()
3997 pSMB->SearchCount = cpu_to_le16(CIFSMaxBufSize/sizeof(FILE_UNIX_INFO)); in CIFSFindFirst()
3998 pSMB->SearchFlags = cpu_to_le16(search_flags); in CIFSFindFirst()
3999 pSMB->InformationLevel = cpu_to_le16(psrch_inf->info_level); in CIFSFindFirst()
4001 /* BB what should we set StorageType to? Does it matter? BB */ in CIFSFindFirst()
4002 pSMB->SearchStorageType = 0; in CIFSFindFirst()
4004 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSFindFirst()
4006 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSFindFirst()
4008 cifs_stats_inc(&tcon->stats.cifs_stats.num_ffirst); in CIFSFindFirst()
4022 if (rc == -EAGAIN) in CIFSFindFirst()
4033 psrch_inf->unicode = !!(pSMBr->hdr.Flags2 & SMBFLG2_UNICODE); in CIFSFindFirst()
4034 psrch_inf->ntwrk_buf_start = (char *)pSMBr; in CIFSFindFirst()
4035 psrch_inf->smallBuf = false; in CIFSFindFirst()
4036 psrch_inf->srch_entries_start = (char *)&pSMBr->hdr.Protocol + in CIFSFindFirst()
4037 le16_to_cpu(pSMBr->t2.DataOffset); in CIFSFindFirst()
4039 parms = (T2_FFIRST_RSP_PARMS *)((char *)&pSMBr->hdr.Protocol + in CIFSFindFirst()
4040 le16_to_cpu(pSMBr->t2.ParameterOffset)); in CIFSFindFirst()
4041 psrch_inf->endOfSearch = !!parms->EndofSearch; in CIFSFindFirst()
4043 psrch_inf->entries_in_buffer = le16_to_cpu(parms->SearchCount); in CIFSFindFirst()
4044 psrch_inf->index_of_last_entry = 2 /* skip . and .. */ + in CIFSFindFirst()
4045 psrch_inf->entries_in_buffer; in CIFSFindFirst()
4046 lnoff = le16_to_cpu(parms->LastNameOffset); in CIFSFindFirst()
4049 psrch_inf->last_entry = NULL; in CIFSFindFirst()
4051 psrch_inf->last_entry = psrch_inf->srch_entries_start + lnoff; in CIFSFindFirst()
4053 *pnetfid = parms->SearchHandle; in CIFSFindFirst()
4074 if (psrch_inf->endOfSearch) in CIFSFindNext()
4075 return -ENOENT; in CIFSFindNext()
4084 pSMB->TotalDataCount = 0; /* no EAs */ in CIFSFindNext()
4085 pSMB->MaxParameterCount = cpu_to_le16(8); in CIFSFindNext()
4086 pSMB->MaxDataCount = cpu_to_le16(CIFSMaxBufSize & 0xFFFFFF00); in CIFSFindNext()
4087 pSMB->MaxSetupCount = 0; in CIFSFindNext()
4088 pSMB->Reserved = 0; in CIFSFindNext()
4089 pSMB->Flags = 0; in CIFSFindNext()
4090 pSMB->Timeout = 0; in CIFSFindNext()
4091 pSMB->Reserved2 = 0; in CIFSFindNext()
4092 pSMB->ParameterOffset = cpu_to_le16( in CIFSFindNext()
4093 offsetof(struct smb_com_transaction2_fnext_req,SearchHandle) - 4); in CIFSFindNext()
4094 pSMB->DataCount = 0; in CIFSFindNext()
4095 pSMB->DataOffset = 0; in CIFSFindNext()
4096 pSMB->SetupCount = 1; in CIFSFindNext()
4097 pSMB->Reserved3 = 0; in CIFSFindNext()
4098 pSMB->SubCommand = cpu_to_le16(TRANS2_FIND_NEXT); in CIFSFindNext()
4099 pSMB->SearchHandle = searchHandle; /* always kept as le */ in CIFSFindNext()
4100 pSMB->SearchCount = in CIFSFindNext()
4102 pSMB->InformationLevel = cpu_to_le16(psrch_inf->info_level); in CIFSFindNext()
4103 pSMB->ResumeKey = psrch_inf->resume_key; in CIFSFindNext()
4104 pSMB->SearchFlags = cpu_to_le16(search_flags); in CIFSFindNext()
4106 name_len = psrch_inf->resume_name_len; in CIFSFindNext()
4109 memcpy(pSMB->ResumeFileName, psrch_inf->presume_name, name_len); in CIFSFindNext()
4112 pSMB->ResumeFileName[name_len] = 0; in CIFSFindNext()
4113 pSMB->ResumeFileName[name_len+1] = 0; in CIFSFindNext()
4116 return -EINVAL; in CIFSFindNext()
4119 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSFindNext()
4120 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSFindNext()
4122 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSFindNext()
4124 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSFindNext()
4126 cifs_stats_inc(&tcon->stats.cifs_stats.num_fnext); in CIFSFindNext()
4130 if (rc == -EBADF) { in CIFSFindNext()
4131 psrch_inf->endOfSearch = true; in CIFSFindNext()
4146 psrch_inf->unicode = !!(pSMBr->hdr.Flags2 & SMBFLG2_UNICODE); in CIFSFindNext()
4147 response_data = (char *)&pSMBr->hdr.Protocol + in CIFSFindNext()
4148 le16_to_cpu(pSMBr->t2.ParameterOffset); in CIFSFindNext()
4150 response_data = (char *)&pSMBr->hdr.Protocol + in CIFSFindNext()
4151 le16_to_cpu(pSMBr->t2.DataOffset); in CIFSFindNext()
4153 if (psrch_inf->smallBuf) in CIFSFindNext()
4154 cifs_small_buf_release(psrch_inf->ntwrk_buf_start); in CIFSFindNext()
4156 cifs_buf_release(psrch_inf->ntwrk_buf_start); in CIFSFindNext()
4158 psrch_inf->srch_entries_start = response_data; in CIFSFindNext()
4159 psrch_inf->ntwrk_buf_start = (char *)pSMB; in CIFSFindNext()
4160 psrch_inf->smallBuf = false; in CIFSFindNext()
4161 psrch_inf->endOfSearch = !!parms->EndofSearch; in CIFSFindNext()
4162 psrch_inf->entries_in_buffer = le16_to_cpu(parms->SearchCount); in CIFSFindNext()
4163 psrch_inf->index_of_last_entry += psrch_inf->entries_in_buffer; in CIFSFindNext()
4164 lnoff = le16_to_cpu(parms->LastNameOffset); in CIFSFindNext()
4167 psrch_inf->last_entry = NULL; in CIFSFindNext()
4169 psrch_inf->last_entry = in CIFSFindNext()
4170 psrch_inf->srch_entries_start + lnoff; in CIFSFindNext()
4178 * Note: On -EAGAIN error only caller can retry on handle based calls in CIFSFindNext()
4196 if (rc == -EAGAIN) in CIFSFindClose()
4201 pSMB->FileID = searchHandle; in CIFSFindClose()
4202 pSMB->ByteCount = 0; in CIFSFindClose()
4203 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSFindClose()
4208 cifs_stats_inc(&tcon->stats.cifs_stats.num_fclose); in CIFSFindClose()
4211 if (rc == -EAGAIN) in CIFSFindClose()
4230 return -ENODEV; in CIFSGetSrvInodeNumber()
4238 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSGetSrvInodeNumber()
4240 cifsConvertToUTF16((__le16 *) pSMB->FileName, in CIFSGetSrvInodeNumber()
4246 name_len = copy_path_name(pSMB->FileName, search_name); in CIFSGetSrvInodeNumber()
4250 pSMB->TotalDataCount = 0; in CIFSGetSrvInodeNumber()
4251 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSGetSrvInodeNumber()
4253 pSMB->MaxDataCount = cpu_to_le16(4000); in CIFSGetSrvInodeNumber()
4254 pSMB->MaxSetupCount = 0; in CIFSGetSrvInodeNumber()
4255 pSMB->Reserved = 0; in CIFSGetSrvInodeNumber()
4256 pSMB->Flags = 0; in CIFSGetSrvInodeNumber()
4257 pSMB->Timeout = 0; in CIFSGetSrvInodeNumber()
4258 pSMB->Reserved2 = 0; in CIFSGetSrvInodeNumber()
4259 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSGetSrvInodeNumber()
4260 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSGetSrvInodeNumber()
4261 pSMB->DataCount = 0; in CIFSGetSrvInodeNumber()
4262 pSMB->DataOffset = 0; in CIFSGetSrvInodeNumber()
4263 pSMB->SetupCount = 1; in CIFSGetSrvInodeNumber()
4264 pSMB->Reserved3 = 0; in CIFSGetSrvInodeNumber()
4265 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSGetSrvInodeNumber()
4267 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSGetSrvInodeNumber()
4268 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSGetSrvInodeNumber()
4269 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_INTERNAL_INFO); in CIFSGetSrvInodeNumber()
4270 pSMB->Reserved4 = 0; in CIFSGetSrvInodeNumber()
4272 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSGetSrvInodeNumber()
4274 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSGetSrvInodeNumber()
4282 if (rc || get_bcc(&pSMBr->hdr) < 2) in CIFSGetSrvInodeNumber()
4285 rc = -EIO; /* bad smb */ in CIFSGetSrvInodeNumber()
4287 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSGetSrvInodeNumber()
4288 __u16 count = le16_to_cpu(pSMBr->t2.DataCount); in CIFSGetSrvInodeNumber()
4293 rc = -EIO; in CIFSGetSrvInodeNumber()
4297 (data_offset + (char *) &pSMBr->hdr.Protocol); in CIFSGetSrvInodeNumber()
4298 *inode_number = le64_to_cpu(pfinfo->UniqueId); in CIFSGetSrvInodeNumber()
4303 if (rc == -EAGAIN) in CIFSGetSrvInodeNumber()
4325 if (ses == NULL || ses->tcon_ipc == NULL) in CIFSGetDFSRefer()
4326 return -ENODEV; in CIFSGetDFSRefer()
4334 rc = smb_init_no_reconnect(SMB_COM_TRANSACTION2, 15, ses->tcon_ipc, in CIFSGetDFSRefer()
4341 pSMB->hdr.Mid = get_next_mid(ses->server); in CIFSGetDFSRefer()
4342 pSMB->hdr.Tid = ses->tcon_ipc->tid; in CIFSGetDFSRefer()
4343 pSMB->hdr.Uid = ses->Suid; in CIFSGetDFSRefer()
4344 if (ses->capabilities & CAP_STATUS32) in CIFSGetDFSRefer()
4345 pSMB->hdr.Flags2 |= SMBFLG2_ERR_STATUS; in CIFSGetDFSRefer()
4346 if (ses->capabilities & CAP_DFS) in CIFSGetDFSRefer()
4347 pSMB->hdr.Flags2 |= SMBFLG2_DFS; in CIFSGetDFSRefer()
4349 if (ses->capabilities & CAP_UNICODE) { in CIFSGetDFSRefer()
4350 pSMB->hdr.Flags2 |= SMBFLG2_UNICODE; in CIFSGetDFSRefer()
4352 cifsConvertToUTF16((__le16 *) pSMB->RequestFileName, in CIFSGetDFSRefer()
4358 name_len = copy_path_name(pSMB->RequestFileName, search_name); in CIFSGetDFSRefer()
4361 if (ses->server->sign) in CIFSGetDFSRefer()
4362 pSMB->hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE; in CIFSGetDFSRefer()
4364 pSMB->hdr.Uid = ses->Suid; in CIFSGetDFSRefer()
4367 pSMB->TotalDataCount = 0; in CIFSGetDFSRefer()
4368 pSMB->DataCount = 0; in CIFSGetDFSRefer()
4369 pSMB->DataOffset = 0; in CIFSGetDFSRefer()
4370 pSMB->MaxParameterCount = 0; in CIFSGetDFSRefer()
4372 pSMB->MaxDataCount = cpu_to_le16(4000); in CIFSGetDFSRefer()
4373 pSMB->MaxSetupCount = 0; in CIFSGetDFSRefer()
4374 pSMB->Reserved = 0; in CIFSGetDFSRefer()
4375 pSMB->Flags = 0; in CIFSGetDFSRefer()
4376 pSMB->Timeout = 0; in CIFSGetDFSRefer()
4377 pSMB->Reserved2 = 0; in CIFSGetDFSRefer()
4378 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSGetDFSRefer()
4379 struct smb_com_transaction2_get_dfs_refer_req, MaxReferralLevel) - 4); in CIFSGetDFSRefer()
4380 pSMB->SetupCount = 1; in CIFSGetDFSRefer()
4381 pSMB->Reserved3 = 0; in CIFSGetDFSRefer()
4382 pSMB->SubCommand = cpu_to_le16(TRANS2_GET_DFS_REFERRAL); in CIFSGetDFSRefer()
4384 pSMB->ParameterCount = cpu_to_le16(params); in CIFSGetDFSRefer()
4385 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSGetDFSRefer()
4386 pSMB->MaxReferralLevel = cpu_to_le16(3); in CIFSGetDFSRefer()
4388 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSGetDFSRefer()
4399 if (rc || get_bcc(&pSMBr->hdr) < 17) { in CIFSGetDFSRefer()
4400 rc = -EIO; /* bad smb */ in CIFSGetDFSRefer()
4405 get_bcc(&pSMBr->hdr), le16_to_cpu(pSMBr->t2.DataOffset)); in CIFSGetDFSRefer()
4408 rc = parse_dfs_referrals(&pSMBr->dfs_data, in CIFSGetDFSRefer()
4409 le16_to_cpu(pSMBr->t2.DataCount), in CIFSGetDFSRefer()
4412 (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) != 0); in CIFSGetDFSRefer()
4417 if (rc == -EAGAIN) in CIFSGetDFSRefer()
4444 pSMB->TotalDataCount = 0; in SMBOldQFSInfo()
4445 pSMB->MaxParameterCount = cpu_to_le16(2); in SMBOldQFSInfo()
4446 pSMB->MaxDataCount = cpu_to_le16(1000); in SMBOldQFSInfo()
4447 pSMB->MaxSetupCount = 0; in SMBOldQFSInfo()
4448 pSMB->Reserved = 0; in SMBOldQFSInfo()
4449 pSMB->Flags = 0; in SMBOldQFSInfo()
4450 pSMB->Timeout = 0; in SMBOldQFSInfo()
4451 pSMB->Reserved2 = 0; in SMBOldQFSInfo()
4453 pSMB->TotalParameterCount = cpu_to_le16(params); in SMBOldQFSInfo()
4454 pSMB->ParameterCount = pSMB->TotalParameterCount; in SMBOldQFSInfo()
4455 pSMB->ParameterOffset = cpu_to_le16(offsetof( in SMBOldQFSInfo()
4456 struct smb_com_transaction2_qfsi_req, InformationLevel) - 4); in SMBOldQFSInfo()
4457 pSMB->DataCount = 0; in SMBOldQFSInfo()
4458 pSMB->DataOffset = 0; in SMBOldQFSInfo()
4459 pSMB->SetupCount = 1; in SMBOldQFSInfo()
4460 pSMB->Reserved3 = 0; in SMBOldQFSInfo()
4461 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in SMBOldQFSInfo()
4462 pSMB->InformationLevel = cpu_to_le16(SMB_INFO_ALLOCATION); in SMBOldQFSInfo()
4464 pSMB->ByteCount = cpu_to_le16(byte_count); in SMBOldQFSInfo()
4466 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in SMBOldQFSInfo()
4473 if (rc || get_bcc(&pSMBr->hdr) < 18) in SMBOldQFSInfo()
4474 rc = -EIO; /* bad smb */ in SMBOldQFSInfo()
4476 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in SMBOldQFSInfo()
4478 get_bcc(&pSMBr->hdr), data_offset); in SMBOldQFSInfo()
4481 (((char *) &pSMBr->hdr.Protocol) + data_offset); in SMBOldQFSInfo()
4482 FSData->f_bsize = in SMBOldQFSInfo()
4483 le16_to_cpu(response_data->BytesPerSector) * in SMBOldQFSInfo()
4484 le32_to_cpu(response_data-> in SMBOldQFSInfo()
4490 if (FSData->f_bsize < 512) in SMBOldQFSInfo()
4491 FSData->f_bsize = 4096; in SMBOldQFSInfo()
4493 FSData->f_blocks = in SMBOldQFSInfo()
4494 le32_to_cpu(response_data->TotalAllocationUnits); in SMBOldQFSInfo()
4495 FSData->f_bfree = FSData->f_bavail = in SMBOldQFSInfo()
4496 le32_to_cpu(response_data->FreeAllocationUnits); in SMBOldQFSInfo()
4498 (unsigned long long)FSData->f_blocks, in SMBOldQFSInfo()
4499 (unsigned long long)FSData->f_bfree, in SMBOldQFSInfo()
4500 FSData->f_bsize); in SMBOldQFSInfo()
4505 if (rc == -EAGAIN) in SMBOldQFSInfo()
4531 pSMB->TotalDataCount = 0; in CIFSSMBQFSInfo()
4532 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSInfo()
4533 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBQFSInfo()
4534 pSMB->MaxSetupCount = 0; in CIFSSMBQFSInfo()
4535 pSMB->Reserved = 0; in CIFSSMBQFSInfo()
4536 pSMB->Flags = 0; in CIFSSMBQFSInfo()
4537 pSMB->Timeout = 0; in CIFSSMBQFSInfo()
4538 pSMB->Reserved2 = 0; in CIFSSMBQFSInfo()
4540 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQFSInfo()
4541 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQFSInfo()
4542 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQFSInfo()
4543 struct smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSInfo()
4544 pSMB->DataCount = 0; in CIFSSMBQFSInfo()
4545 pSMB->DataOffset = 0; in CIFSSMBQFSInfo()
4546 pSMB->SetupCount = 1; in CIFSSMBQFSInfo()
4547 pSMB->Reserved3 = 0; in CIFSSMBQFSInfo()
4548 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSInfo()
4549 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FS_SIZE_INFO); in CIFSSMBQFSInfo()
4551 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSInfo()
4553 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSInfo()
4560 if (rc || get_bcc(&pSMBr->hdr) < 24) in CIFSSMBQFSInfo()
4561 rc = -EIO; /* bad smb */ in CIFSSMBQFSInfo()
4563 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSInfo()
4567 *) (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSInfo()
4569 FSData->f_bsize = in CIFSSMBQFSInfo()
4570 le32_to_cpu(response_data->BytesPerSector) * in CIFSSMBQFSInfo()
4571 le32_to_cpu(response_data-> in CIFSSMBQFSInfo()
4577 if (FSData->f_bsize < 512) in CIFSSMBQFSInfo()
4578 FSData->f_bsize = 4096; in CIFSSMBQFSInfo()
4580 FSData->f_blocks = in CIFSSMBQFSInfo()
4581 le64_to_cpu(response_data->TotalAllocationUnits); in CIFSSMBQFSInfo()
4582 FSData->f_bfree = FSData->f_bavail = in CIFSSMBQFSInfo()
4583 le64_to_cpu(response_data->FreeAllocationUnits); in CIFSSMBQFSInfo()
4585 (unsigned long long)FSData->f_blocks, in CIFSSMBQFSInfo()
4586 (unsigned long long)FSData->f_bfree, in CIFSSMBQFSInfo()
4587 FSData->f_bsize); in CIFSSMBQFSInfo()
4592 if (rc == -EAGAIN) in CIFSSMBQFSInfo()
4617 pSMB->TotalDataCount = 0; in CIFSSMBQFSAttributeInfo()
4618 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSAttributeInfo()
4620 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBQFSAttributeInfo()
4621 pSMB->MaxSetupCount = 0; in CIFSSMBQFSAttributeInfo()
4622 pSMB->Reserved = 0; in CIFSSMBQFSAttributeInfo()
4623 pSMB->Flags = 0; in CIFSSMBQFSAttributeInfo()
4624 pSMB->Timeout = 0; in CIFSSMBQFSAttributeInfo()
4625 pSMB->Reserved2 = 0; in CIFSSMBQFSAttributeInfo()
4627 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQFSAttributeInfo()
4628 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQFSAttributeInfo()
4629 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQFSAttributeInfo()
4630 struct smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSAttributeInfo()
4631 pSMB->DataCount = 0; in CIFSSMBQFSAttributeInfo()
4632 pSMB->DataOffset = 0; in CIFSSMBQFSAttributeInfo()
4633 pSMB->SetupCount = 1; in CIFSSMBQFSAttributeInfo()
4634 pSMB->Reserved3 = 0; in CIFSSMBQFSAttributeInfo()
4635 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSAttributeInfo()
4636 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FS_ATTRIBUTE_INFO); in CIFSSMBQFSAttributeInfo()
4638 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSAttributeInfo()
4640 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSAttributeInfo()
4647 if (rc || get_bcc(&pSMBr->hdr) < 13) { in CIFSSMBQFSAttributeInfo()
4649 rc = -EIO; /* bad smb */ in CIFSSMBQFSAttributeInfo()
4651 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSAttributeInfo()
4654 *) (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSAttributeInfo()
4656 memcpy(&tcon->fsAttrInfo, response_data, in CIFSSMBQFSAttributeInfo()
4662 if (rc == -EAGAIN) in CIFSSMBQFSAttributeInfo()
4687 pSMB->TotalDataCount = 0; in CIFSSMBQFSDeviceInfo()
4688 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSDeviceInfo()
4690 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBQFSDeviceInfo()
4691 pSMB->MaxSetupCount = 0; in CIFSSMBQFSDeviceInfo()
4692 pSMB->Reserved = 0; in CIFSSMBQFSDeviceInfo()
4693 pSMB->Flags = 0; in CIFSSMBQFSDeviceInfo()
4694 pSMB->Timeout = 0; in CIFSSMBQFSDeviceInfo()
4695 pSMB->Reserved2 = 0; in CIFSSMBQFSDeviceInfo()
4697 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQFSDeviceInfo()
4698 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQFSDeviceInfo()
4699 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQFSDeviceInfo()
4700 struct smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSDeviceInfo()
4702 pSMB->DataCount = 0; in CIFSSMBQFSDeviceInfo()
4703 pSMB->DataOffset = 0; in CIFSSMBQFSDeviceInfo()
4704 pSMB->SetupCount = 1; in CIFSSMBQFSDeviceInfo()
4705 pSMB->Reserved3 = 0; in CIFSSMBQFSDeviceInfo()
4706 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSDeviceInfo()
4707 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FS_DEVICE_INFO); in CIFSSMBQFSDeviceInfo()
4709 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSDeviceInfo()
4711 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSDeviceInfo()
4718 if (rc || get_bcc(&pSMBr->hdr) < in CIFSSMBQFSDeviceInfo()
4720 rc = -EIO; /* bad smb */ in CIFSSMBQFSDeviceInfo()
4722 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSDeviceInfo()
4725 (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSDeviceInfo()
4727 memcpy(&tcon->fsDevInfo, response_data, in CIFSSMBQFSDeviceInfo()
4733 if (rc == -EAGAIN) in CIFSSMBQFSDeviceInfo()
4758 pSMB->TotalDataCount = 0; in CIFSSMBQFSUnixInfo()
4759 pSMB->DataCount = 0; in CIFSSMBQFSUnixInfo()
4760 pSMB->DataOffset = 0; in CIFSSMBQFSUnixInfo()
4761 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSUnixInfo()
4763 pSMB->MaxDataCount = cpu_to_le16(100); in CIFSSMBQFSUnixInfo()
4764 pSMB->MaxSetupCount = 0; in CIFSSMBQFSUnixInfo()
4765 pSMB->Reserved = 0; in CIFSSMBQFSUnixInfo()
4766 pSMB->Flags = 0; in CIFSSMBQFSUnixInfo()
4767 pSMB->Timeout = 0; in CIFSSMBQFSUnixInfo()
4768 pSMB->Reserved2 = 0; in CIFSSMBQFSUnixInfo()
4770 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBQFSUnixInfo()
4771 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBQFSUnixInfo()
4772 pSMB->ParameterOffset = cpu_to_le16(offsetof(struct in CIFSSMBQFSUnixInfo()
4773 smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSUnixInfo()
4774 pSMB->SetupCount = 1; in CIFSSMBQFSUnixInfo()
4775 pSMB->Reserved3 = 0; in CIFSSMBQFSUnixInfo()
4776 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSUnixInfo()
4777 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_CIFS_UNIX_INFO); in CIFSSMBQFSUnixInfo()
4779 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSUnixInfo()
4781 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSUnixInfo()
4788 if (rc || get_bcc(&pSMBr->hdr) < 13) { in CIFSSMBQFSUnixInfo()
4789 rc = -EIO; /* bad smb */ in CIFSSMBQFSUnixInfo()
4791 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSUnixInfo()
4794 *) (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSUnixInfo()
4796 memcpy(&tcon->fsUnixInfo, response_data, in CIFSSMBQFSUnixInfo()
4802 if (rc == -EAGAIN) in CIFSSMBQFSUnixInfo()
4828 pSMB->MaxSetupCount = 0; in CIFSSMBSetFSUnixInfo()
4829 pSMB->Reserved = 0; in CIFSSMBSetFSUnixInfo()
4830 pSMB->Flags = 0; in CIFSSMBSetFSUnixInfo()
4831 pSMB->Timeout = 0; in CIFSSMBSetFSUnixInfo()
4832 pSMB->Reserved2 = 0; in CIFSSMBSetFSUnixInfo()
4834 - 4; in CIFSSMBSetFSUnixInfo()
4837 pSMB->MaxParameterCount = cpu_to_le16(4); in CIFSSMBSetFSUnixInfo()
4839 pSMB->MaxDataCount = cpu_to_le16(100); in CIFSSMBSetFSUnixInfo()
4840 pSMB->SetupCount = 1; in CIFSSMBSetFSUnixInfo()
4841 pSMB->Reserved3 = 0; in CIFSSMBSetFSUnixInfo()
4842 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FS_INFORMATION); in CIFSSMBSetFSUnixInfo()
4845 pSMB->DataCount = cpu_to_le16(12); in CIFSSMBSetFSUnixInfo()
4846 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetFSUnixInfo()
4847 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetFSUnixInfo()
4848 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetFSUnixInfo()
4849 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetFSUnixInfo()
4850 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetFSUnixInfo()
4853 pSMB->FileNum = 0; in CIFSSMBSetFSUnixInfo()
4854 pSMB->InformationLevel = cpu_to_le16(SMB_SET_CIFS_UNIX_INFO); in CIFSSMBSetFSUnixInfo()
4857 pSMB->ClientUnixMajor = cpu_to_le16(CIFS_UNIX_MAJOR_VERSION); in CIFSSMBSetFSUnixInfo()
4858 pSMB->ClientUnixMinor = cpu_to_le16(CIFS_UNIX_MINOR_VERSION); in CIFSSMBSetFSUnixInfo()
4859 pSMB->ClientUnixCap = cpu_to_le64(cap); in CIFSSMBSetFSUnixInfo()
4862 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetFSUnixInfo()
4864 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetFSUnixInfo()
4871 rc = -EIO; /* bad smb */ in CIFSSMBSetFSUnixInfo()
4875 if (rc == -EAGAIN) in CIFSSMBSetFSUnixInfo()
4903 pSMB->TotalDataCount = 0; in CIFSSMBQFSPosixInfo()
4904 pSMB->DataCount = 0; in CIFSSMBQFSPosixInfo()
4905 pSMB->DataOffset = 0; in CIFSSMBQFSPosixInfo()
4906 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSPosixInfo()
4908 pSMB->MaxDataCount = cpu_to_le16(100); in CIFSSMBQFSPosixInfo()
4909 pSMB->MaxSetupCount = 0; in CIFSSMBQFSPosixInfo()
4910 pSMB->Reserved = 0; in CIFSSMBQFSPosixInfo()
4911 pSMB->Flags = 0; in CIFSSMBQFSPosixInfo()
4912 pSMB->Timeout = 0; in CIFSSMBQFSPosixInfo()
4913 pSMB->Reserved2 = 0; in CIFSSMBQFSPosixInfo()
4915 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBQFSPosixInfo()
4916 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBQFSPosixInfo()
4917 pSMB->ParameterOffset = cpu_to_le16(offsetof(struct in CIFSSMBQFSPosixInfo()
4918 smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSPosixInfo()
4919 pSMB->SetupCount = 1; in CIFSSMBQFSPosixInfo()
4920 pSMB->Reserved3 = 0; in CIFSSMBQFSPosixInfo()
4921 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSPosixInfo()
4922 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_POSIX_FS_INFO); in CIFSSMBQFSPosixInfo()
4924 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSPosixInfo()
4926 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSPosixInfo()
4933 if (rc || get_bcc(&pSMBr->hdr) < 13) { in CIFSSMBQFSPosixInfo()
4934 rc = -EIO; /* bad smb */ in CIFSSMBQFSPosixInfo()
4936 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSPosixInfo()
4939 *) (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSPosixInfo()
4941 FSData->f_bsize = in CIFSSMBQFSPosixInfo()
4942 le32_to_cpu(response_data->BlockSize); in CIFSSMBQFSPosixInfo()
4947 if (FSData->f_bsize < 512) in CIFSSMBQFSPosixInfo()
4948 FSData->f_bsize = 4096; in CIFSSMBQFSPosixInfo()
4950 FSData->f_blocks = in CIFSSMBQFSPosixInfo()
4951 le64_to_cpu(response_data->TotalBlocks); in CIFSSMBQFSPosixInfo()
4952 FSData->f_bfree = in CIFSSMBQFSPosixInfo()
4953 le64_to_cpu(response_data->BlocksAvail); in CIFSSMBQFSPosixInfo()
4954 if (response_data->UserBlocksAvail == cpu_to_le64(-1)) { in CIFSSMBQFSPosixInfo()
4955 FSData->f_bavail = FSData->f_bfree; in CIFSSMBQFSPosixInfo()
4957 FSData->f_bavail = in CIFSSMBQFSPosixInfo()
4958 le64_to_cpu(response_data->UserBlocksAvail); in CIFSSMBQFSPosixInfo()
4960 if (response_data->TotalFileNodes != cpu_to_le64(-1)) in CIFSSMBQFSPosixInfo()
4961 FSData->f_files = in CIFSSMBQFSPosixInfo()
4962 le64_to_cpu(response_data->TotalFileNodes); in CIFSSMBQFSPosixInfo()
4963 if (response_data->FreeFileNodes != cpu_to_le64(-1)) in CIFSSMBQFSPosixInfo()
4964 FSData->f_ffree = in CIFSSMBQFSPosixInfo()
4965 le64_to_cpu(response_data->FreeFileNodes); in CIFSSMBQFSPosixInfo()
4970 if (rc == -EAGAIN) in CIFSSMBQFSPosixInfo()
4978 * We can not use write of zero bytes trick to set file size due to need for
5005 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBSetEOF()
5007 cifsConvertToUTF16((__le16 *) pSMB->FileName, file_name, in CIFSSMBSetEOF()
5008 PATH_MAX, cifs_sb->local_nls, remap); in CIFSSMBSetEOF()
5012 name_len = copy_path_name(pSMB->FileName, file_name); in CIFSSMBSetEOF()
5016 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetEOF()
5017 pSMB->MaxDataCount = cpu_to_le16(4100); in CIFSSMBSetEOF()
5018 pSMB->MaxSetupCount = 0; in CIFSSMBSetEOF()
5019 pSMB->Reserved = 0; in CIFSSMBSetEOF()
5020 pSMB->Flags = 0; in CIFSSMBSetEOF()
5021 pSMB->Timeout = 0; in CIFSSMBSetEOF()
5022 pSMB->Reserved2 = 0; in CIFSSMBSetEOF()
5024 InformationLevel) - 4; in CIFSSMBSetEOF()
5027 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetEOF()
5028 pSMB->InformationLevel = in CIFSSMBSetEOF()
5031 pSMB->InformationLevel = in CIFSSMBSetEOF()
5033 } else /* Set File Size */ { in CIFSSMBSetEOF()
5034 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetEOF()
5035 pSMB->InformationLevel = in CIFSSMBSetEOF()
5038 pSMB->InformationLevel = in CIFSSMBSetEOF()
5043 (struct file_end_of_file_info *) (((char *) &pSMB->hdr.Protocol) + in CIFSSMBSetEOF()
5045 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetEOF()
5046 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetEOF()
5047 pSMB->SetupCount = 1; in CIFSSMBSetEOF()
5048 pSMB->Reserved3 = 0; in CIFSSMBSetEOF()
5049 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSSMBSetEOF()
5051 pSMB->DataCount = cpu_to_le16(data_count); in CIFSSMBSetEOF()
5052 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetEOF()
5053 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetEOF()
5054 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetEOF()
5055 pSMB->Reserved4 = 0; in CIFSSMBSetEOF()
5057 parm_data->FileSize = cpu_to_le64(size); in CIFSSMBSetEOF()
5058 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetEOF()
5059 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetEOF()
5066 if (rc == -EAGAIN) in CIFSSMBSetEOF()
5088 pSMB->hdr.Pid = cpu_to_le16((__u16)cfile->pid); in CIFSSMBSetFileSize()
5089 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(cfile->pid >> 16)); in CIFSSMBSetFileSize()
5092 pSMB->MaxSetupCount = 0; in CIFSSMBSetFileSize()
5093 pSMB->Reserved = 0; in CIFSSMBSetFileSize()
5094 pSMB->Flags = 0; in CIFSSMBSetFileSize()
5095 pSMB->Timeout = 0; in CIFSSMBSetFileSize()
5096 pSMB->Reserved2 = 0; in CIFSSMBSetFileSize()
5097 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBSetFileSize()
5101 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetFileSize()
5103 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetFileSize()
5104 pSMB->SetupCount = 1; in CIFSSMBSetFileSize()
5105 pSMB->Reserved3 = 0; in CIFSSMBSetFileSize()
5106 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBSetFileSize()
5108 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetFileSize()
5109 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetFileSize()
5110 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetFileSize()
5111 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetFileSize()
5112 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetFileSize()
5116 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetFileSize()
5117 parm_data->FileSize = cpu_to_le64(size); in CIFSSMBSetFileSize()
5118 pSMB->Fid = cfile->fid.netfid; in CIFSSMBSetFileSize()
5120 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetFileSize()
5121 pSMB->InformationLevel = in CIFSSMBSetFileSize()
5124 pSMB->InformationLevel = in CIFSSMBSetFileSize()
5126 } else /* Set File Size */ { in CIFSSMBSetFileSize()
5127 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetFileSize()
5128 pSMB->InformationLevel = in CIFSSMBSetFileSize()
5131 pSMB->InformationLevel = in CIFSSMBSetFileSize()
5134 pSMB->Reserved4 = 0; in CIFSSMBSetFileSize()
5136 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetFileSize()
5137 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBSetFileSize()
5144 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBSetFileSize()
5150 /* Some legacy servers such as NT4 require that the file times be set on
5151 an open handle, rather than by pathname - this is awkward due to
5165 cifs_dbg(FYI, "Set Times (via SetFileInfo)\n"); in CIFSSMBSetFileInfo()
5171 pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener); in CIFSSMBSetFileInfo()
5172 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16)); in CIFSSMBSetFileInfo()
5175 pSMB->MaxSetupCount = 0; in CIFSSMBSetFileInfo()
5176 pSMB->Reserved = 0; in CIFSSMBSetFileInfo()
5177 pSMB->Flags = 0; in CIFSSMBSetFileInfo()
5178 pSMB->Timeout = 0; in CIFSSMBSetFileInfo()
5179 pSMB->Reserved2 = 0; in CIFSSMBSetFileInfo()
5180 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBSetFileInfo()
5187 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetFileInfo()
5189 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetFileInfo()
5190 pSMB->SetupCount = 1; in CIFSSMBSetFileInfo()
5191 pSMB->Reserved3 = 0; in CIFSSMBSetFileInfo()
5192 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBSetFileInfo()
5194 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetFileInfo()
5195 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetFileInfo()
5196 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetFileInfo()
5197 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetFileInfo()
5198 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetFileInfo()
5199 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetFileInfo()
5200 pSMB->Fid = fid; in CIFSSMBSetFileInfo()
5201 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetFileInfo()
5202 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_BASIC_INFO2); in CIFSSMBSetFileInfo()
5204 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_BASIC_INFO); in CIFSSMBSetFileInfo()
5205 pSMB->Reserved4 = 0; in CIFSSMBSetFileInfo()
5207 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetFileInfo()
5209 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBSetFileInfo()
5212 cifs_dbg(FYI, "Send error in Set Time (SetFileInfo) = %d\n", in CIFSSMBSetFileInfo()
5215 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBSetFileInfo()
5230 cifs_dbg(FYI, "Set File Disposition (via SetFileInfo)\n"); in CIFSSMBSetFileDisposition()
5236 pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener); in CIFSSMBSetFileDisposition()
5237 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16)); in CIFSSMBSetFileDisposition()
5240 pSMB->MaxSetupCount = 0; in CIFSSMBSetFileDisposition()
5241 pSMB->Reserved = 0; in CIFSSMBSetFileDisposition()
5242 pSMB->Flags = 0; in CIFSSMBSetFileDisposition()
5243 pSMB->Timeout = 0; in CIFSSMBSetFileDisposition()
5244 pSMB->Reserved2 = 0; in CIFSSMBSetFileDisposition()
5245 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBSetFileDisposition()
5252 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetFileDisposition()
5254 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetFileDisposition()
5255 pSMB->SetupCount = 1; in CIFSSMBSetFileDisposition()
5256 pSMB->Reserved3 = 0; in CIFSSMBSetFileDisposition()
5257 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBSetFileDisposition()
5259 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetFileDisposition()
5260 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetFileDisposition()
5261 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetFileDisposition()
5262 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetFileDisposition()
5263 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetFileDisposition()
5264 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetFileDisposition()
5265 pSMB->Fid = fid; in CIFSSMBSetFileDisposition()
5266 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_DISPOSITION_INFO); in CIFSSMBSetFileDisposition()
5267 pSMB->Reserved4 = 0; in CIFSSMBSetFileDisposition()
5269 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetFileDisposition()
5271 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBSetFileDisposition()
5304 rc = CIFSSMBSetFileInfo(xid, tcon, data, fid.netfid, current->tgid); in CIFSSMBSetPathInfoFB()
5334 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBSetPathInfo()
5336 cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, in CIFSSMBSetPathInfo()
5341 name_len = copy_path_name(pSMB->FileName, fileName); in CIFSSMBSetPathInfo()
5346 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetPathInfo()
5348 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetPathInfo()
5349 pSMB->MaxSetupCount = 0; in CIFSSMBSetPathInfo()
5350 pSMB->Reserved = 0; in CIFSSMBSetPathInfo()
5351 pSMB->Flags = 0; in CIFSSMBSetPathInfo()
5352 pSMB->Timeout = 0; in CIFSSMBSetPathInfo()
5353 pSMB->Reserved2 = 0; in CIFSSMBSetPathInfo()
5355 InformationLevel) - 4; in CIFSSMBSetPathInfo()
5357 data_offset = (char *) (&pSMB->hdr.Protocol) + offset; in CIFSSMBSetPathInfo()
5358 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetPathInfo()
5359 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetPathInfo()
5360 pSMB->SetupCount = 1; in CIFSSMBSetPathInfo()
5361 pSMB->Reserved3 = 0; in CIFSSMBSetPathInfo()
5362 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSSMBSetPathInfo()
5365 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetPathInfo()
5366 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetPathInfo()
5367 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetPathInfo()
5368 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetPathInfo()
5369 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetPathInfo()
5370 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_BASIC_INFO2); in CIFSSMBSetPathInfo()
5372 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_BASIC_INFO); in CIFSSMBSetPathInfo()
5373 pSMB->Reserved4 = 0; in CIFSSMBSetPathInfo()
5376 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetPathInfo()
5377 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetPathInfo()
5384 if (rc == -EAGAIN) in CIFSSMBSetPathInfo()
5387 if (rc == -EOPNOTSUPP) in CIFSSMBSetPathInfo()
5399 u64 mode = args->mode; in cifs_fill_unix_set_info()
5401 if (uid_valid(args->uid)) in cifs_fill_unix_set_info()
5402 uid = from_kuid(&init_user_ns, args->uid); in cifs_fill_unix_set_info()
5403 if (gid_valid(args->gid)) in cifs_fill_unix_set_info()
5404 gid = from_kgid(&init_user_ns, args->gid); in cifs_fill_unix_set_info()
5407 * Samba server ignores set of file size to zero due to bugs in some in cifs_fill_unix_set_info()
5408 * older clients, but we should be precise - we use SetFileSize to in cifs_fill_unix_set_info()
5409 * set file size and do not want to truncate file size to zero in cifs_fill_unix_set_info()
5411 * zero instead of -1 here in cifs_fill_unix_set_info()
5413 data_offset->EndOfFile = cpu_to_le64(NO_CHANGE_64); in cifs_fill_unix_set_info()
5414 data_offset->NumOfBytes = cpu_to_le64(NO_CHANGE_64); in cifs_fill_unix_set_info()
5415 data_offset->LastStatusChange = cpu_to_le64(args->ctime); in cifs_fill_unix_set_info()
5416 data_offset->LastAccessTime = cpu_to_le64(args->atime); in cifs_fill_unix_set_info()
5417 data_offset->LastModificationTime = cpu_to_le64(args->mtime); in cifs_fill_unix_set_info()
5418 data_offset->Uid = cpu_to_le64(uid); in cifs_fill_unix_set_info()
5419 data_offset->Gid = cpu_to_le64(gid); in cifs_fill_unix_set_info()
5421 data_offset->DevMajor = cpu_to_le64(MAJOR(args->device)); in cifs_fill_unix_set_info()
5422 data_offset->DevMinor = cpu_to_le64(MINOR(args->device)); in cifs_fill_unix_set_info()
5423 data_offset->Permissions = cpu_to_le64(mode); in cifs_fill_unix_set_info()
5426 data_offset->Type = cpu_to_le32(UNIX_FILE); in cifs_fill_unix_set_info()
5428 data_offset->Type = cpu_to_le32(UNIX_DIR); in cifs_fill_unix_set_info()
5430 data_offset->Type = cpu_to_le32(UNIX_SYMLINK); in cifs_fill_unix_set_info()
5432 data_offset->Type = cpu_to_le32(UNIX_CHARDEV); in cifs_fill_unix_set_info()
5434 data_offset->Type = cpu_to_le32(UNIX_BLOCKDEV); in cifs_fill_unix_set_info()
5436 data_offset->Type = cpu_to_le32(UNIX_FIFO); in cifs_fill_unix_set_info()
5438 data_offset->Type = cpu_to_le32(UNIX_SOCKET); in cifs_fill_unix_set_info()
5451 cifs_dbg(FYI, "Set Unix Info (via SetFileInfo)\n"); in CIFSSMBUnixSetFileInfo()
5457 pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener); in CIFSSMBUnixSetFileInfo()
5458 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16)); in CIFSSMBUnixSetFileInfo()
5461 pSMB->MaxSetupCount = 0; in CIFSSMBUnixSetFileInfo()
5462 pSMB->Reserved = 0; in CIFSSMBUnixSetFileInfo()
5463 pSMB->Flags = 0; in CIFSSMBUnixSetFileInfo()
5464 pSMB->Timeout = 0; in CIFSSMBUnixSetFileInfo()
5465 pSMB->Reserved2 = 0; in CIFSSMBUnixSetFileInfo()
5466 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBUnixSetFileInfo()
5474 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBUnixSetFileInfo()
5476 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBUnixSetFileInfo()
5477 pSMB->SetupCount = 1; in CIFSSMBUnixSetFileInfo()
5478 pSMB->Reserved3 = 0; in CIFSSMBUnixSetFileInfo()
5479 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBUnixSetFileInfo()
5481 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBUnixSetFileInfo()
5482 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBUnixSetFileInfo()
5483 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBUnixSetFileInfo()
5484 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBUnixSetFileInfo()
5485 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBUnixSetFileInfo()
5486 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBUnixSetFileInfo()
5487 pSMB->Fid = fid; in CIFSSMBUnixSetFileInfo()
5488 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_UNIX_BASIC); in CIFSSMBUnixSetFileInfo()
5489 pSMB->Reserved4 = 0; in CIFSSMBUnixSetFileInfo()
5491 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixSetFileInfo()
5495 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBUnixSetFileInfo()
5498 cifs_dbg(FYI, "Send error in Set Time (SetFileInfo) = %d\n", in CIFSSMBUnixSetFileInfo()
5501 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBUnixSetFileInfo()
5528 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBUnixSetPathInfo()
5530 cifsConvertToUTF16((__le16 *) pSMB->FileName, file_name, in CIFSSMBUnixSetPathInfo()
5535 name_len = copy_path_name(pSMB->FileName, file_name); in CIFSSMBUnixSetPathInfo()
5540 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBUnixSetPathInfo()
5542 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBUnixSetPathInfo()
5543 pSMB->MaxSetupCount = 0; in CIFSSMBUnixSetPathInfo()
5544 pSMB->Reserved = 0; in CIFSSMBUnixSetPathInfo()
5545 pSMB->Flags = 0; in CIFSSMBUnixSetPathInfo()
5546 pSMB->Timeout = 0; in CIFSSMBUnixSetPathInfo()
5547 pSMB->Reserved2 = 0; in CIFSSMBUnixSetPathInfo()
5549 InformationLevel) - 4; in CIFSSMBUnixSetPathInfo()
5554 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBUnixSetPathInfo()
5555 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBUnixSetPathInfo()
5556 pSMB->SetupCount = 1; in CIFSSMBUnixSetPathInfo()
5557 pSMB->Reserved3 = 0; in CIFSSMBUnixSetPathInfo()
5558 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSSMBUnixSetPathInfo()
5560 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBUnixSetPathInfo()
5561 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBUnixSetPathInfo()
5562 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBUnixSetPathInfo()
5563 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBUnixSetPathInfo()
5564 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_UNIX_BASIC); in CIFSSMBUnixSetPathInfo()
5565 pSMB->Reserved4 = 0; in CIFSSMBUnixSetPathInfo()
5570 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixSetPathInfo()
5571 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBUnixSetPathInfo()
5577 if (rc == -EAGAIN) in CIFSSMBUnixSetPathInfo()
5584 * Do a path-based QUERY_ALL_EAS call and parse the result. This is a common
5585 * function used by listxattr and getxattr type calls. When ea_name is set,
5602 struct nls_table *nls_codepage = cifs_sb->local_nls; in CIFSSMBQAllEAs()
5620 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBQAllEAs()
5622 cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, in CIFSSMBQAllEAs()
5627 list_len = copy_path_name(pSMB->FileName, searchName); in CIFSSMBQAllEAs()
5631 pSMB->TotalDataCount = 0; in CIFSSMBQAllEAs()
5632 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQAllEAs()
5634 pSMB->MaxDataCount = cpu_to_le16(CIFSMaxBufSize); in CIFSSMBQAllEAs()
5635 pSMB->MaxSetupCount = 0; in CIFSSMBQAllEAs()
5636 pSMB->Reserved = 0; in CIFSSMBQAllEAs()
5637 pSMB->Flags = 0; in CIFSSMBQAllEAs()
5638 pSMB->Timeout = 0; in CIFSSMBQAllEAs()
5639 pSMB->Reserved2 = 0; in CIFSSMBQAllEAs()
5640 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQAllEAs()
5641 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSSMBQAllEAs()
5642 pSMB->DataCount = 0; in CIFSSMBQAllEAs()
5643 pSMB->DataOffset = 0; in CIFSSMBQAllEAs()
5644 pSMB->SetupCount = 1; in CIFSSMBQAllEAs()
5645 pSMB->Reserved3 = 0; in CIFSSMBQAllEAs()
5646 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSSMBQAllEAs()
5648 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQAllEAs()
5649 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQAllEAs()
5650 pSMB->InformationLevel = cpu_to_le16(SMB_INFO_QUERY_ALL_EAS); in CIFSSMBQAllEAs()
5651 pSMB->Reserved4 = 0; in CIFSSMBQAllEAs()
5653 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQAllEAs()
5655 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQAllEAs()
5668 if (rc || get_bcc(&pSMBr->hdr) < 4) { in CIFSSMBQAllEAs()
5669 rc = -EIO; /* bad smb */ in CIFSSMBQAllEAs()
5681 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQAllEAs()
5683 (((char *) &pSMBr->hdr.Protocol) + data_offset); in CIFSSMBQAllEAs()
5685 list_len = le32_to_cpu(ea_response_data->list_len); in CIFSSMBQAllEAs()
5691 rc = -ENODATA; in CIFSSMBQAllEAs()
5696 end_of_smb = (char *)pByteArea(&pSMBr->hdr) + get_bcc(&pSMBr->hdr); in CIFSSMBQAllEAs()
5699 rc = -EIO; in CIFSSMBQAllEAs()
5704 list_len -= 4; in CIFSSMBQAllEAs()
5705 temp_fea = &ea_response_data->list; in CIFSSMBQAllEAs()
5711 list_len -= 4; in CIFSSMBQAllEAs()
5716 rc = -EIO; in CIFSSMBQAllEAs()
5720 name_len = temp_fea->name_len; in CIFSSMBQAllEAs()
5721 value_len = le16_to_cpu(temp_fea->value_len); in CIFSSMBQAllEAs()
5722 list_len -= name_len + 1 + value_len; in CIFSSMBQAllEAs()
5725 rc = -EIO; in CIFSSMBQAllEAs()
5737 rc = -ERANGE; in CIFSSMBQAllEAs()
5755 /* skip copy - calc size only */ in CIFSSMBQAllEAs()
5758 rc = -ERANGE; in CIFSSMBQAllEAs()
5768 rc = -ENODATA; in CIFSSMBQAllEAs()
5772 if (rc == -EAGAIN) in CIFSSMBQAllEAs()
5800 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBSetEA()
5802 cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, in CIFSSMBSetEA()
5807 name_len = copy_path_name(pSMB->FileName, fileName); in CIFSSMBSetEA()
5821 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetEA()
5823 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetEA()
5824 pSMB->MaxSetupCount = 0; in CIFSSMBSetEA()
5825 pSMB->Reserved = 0; in CIFSSMBSetEA()
5826 pSMB->Flags = 0; in CIFSSMBSetEA()
5827 pSMB->Timeout = 0; in CIFSSMBSetEA()
5828 pSMB->Reserved2 = 0; in CIFSSMBSetEA()
5830 InformationLevel) - 4; in CIFSSMBSetEA()
5832 pSMB->InformationLevel = in CIFSSMBSetEA()
5836 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetEA()
5837 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetEA()
5838 pSMB->SetupCount = 1; in CIFSSMBSetEA()
5839 pSMB->Reserved3 = 0; in CIFSSMBSetEA()
5840 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSSMBSetEA()
5842 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetEA()
5843 parm_data->list_len = cpu_to_le32(count); in CIFSSMBSetEA()
5844 parm_data->list.EA_flags = 0; in CIFSSMBSetEA()
5846 parm_data->list.name_len = (__u8)name_len; in CIFSSMBSetEA()
5849 strncpy(parm_data->list.name, ea_name, name_len); in CIFSSMBSetEA()
5850 parm_data->list.name[name_len] = '\0'; in CIFSSMBSetEA()
5851 parm_data->list.value_len = cpu_to_le16(ea_value_len); in CIFSSMBSetEA()
5857 /* if (ea_value_len > buffer_size - 512 (enough for header)) */ in CIFSSMBSetEA()
5859 memcpy(parm_data->list.name + name_len + 1, in CIFSSMBSetEA()
5862 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetEA()
5863 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetEA()
5864 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetEA()
5865 pSMB->Reserved4 = 0; in CIFSSMBSetEA()
5867 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetEA()
5868 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetEA()
5875 if (rc == -EAGAIN) in CIFSSMBSetEA()