• 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()
2716 if (cap_unix(tcon->ses)) in cifs_query_reparse_point()
2717 return -EOPNOTSUPP; in cifs_query_reparse_point()
2739 io_req->TotalParameterCount = 0; in cifs_query_reparse_point()
2740 io_req->TotalDataCount = 0; in cifs_query_reparse_point()
2741 io_req->MaxParameterCount = cpu_to_le32(2); in cifs_query_reparse_point()
2743 io_req->MaxDataCount = cpu_to_le32(CIFSMaxBufSize & 0xFFFFFF00); in cifs_query_reparse_point()
2744 io_req->MaxSetupCount = 4; in cifs_query_reparse_point()
2745 io_req->Reserved = 0; in cifs_query_reparse_point()
2746 io_req->ParameterOffset = 0; in cifs_query_reparse_point()
2747 io_req->DataCount = 0; in cifs_query_reparse_point()
2748 io_req->DataOffset = 0; in cifs_query_reparse_point()
2749 io_req->SetupCount = 4; in cifs_query_reparse_point()
2750 io_req->SubCommand = cpu_to_le16(NT_TRANSACT_IOCTL); in cifs_query_reparse_point()
2751 io_req->ParameterCount = io_req->TotalParameterCount; in cifs_query_reparse_point()
2752 io_req->FunctionCode = cpu_to_le32(FSCTL_GET_REPARSE_POINT); in cifs_query_reparse_point()
2753 io_req->IsFsctl = 1; in cifs_query_reparse_point()
2754 io_req->IsRootFlag = 0; in cifs_query_reparse_point()
2755 io_req->Fid = fid.netfid; in cifs_query_reparse_point()
2756 io_req->ByteCount = 0; in cifs_query_reparse_point()
2758 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *)io_req, in cifs_query_reparse_point()
2763 data_offset = le32_to_cpu(io_rsp->DataOffset); in cifs_query_reparse_point()
2764 data_count = le32_to_cpu(io_rsp->DataCount); in cifs_query_reparse_point()
2765 if (get_bcc(&io_rsp->hdr) < 2 || data_offset > 512 || in cifs_query_reparse_point()
2767 rc = -EIO; in cifs_query_reparse_point()
2771 end = 2 + get_bcc(&io_rsp->hdr) + (__u8 *)&io_rsp->ByteCount; in cifs_query_reparse_point()
2772 start = (__u8 *)&io_rsp->hdr.Protocol + data_offset; in cifs_query_reparse_point()
2774 rc = -EIO; in cifs_query_reparse_point()
2778 data_count = le16_to_cpu(io_rsp->ByteCount); in cifs_query_reparse_point()
2782 data_count < le16_to_cpu(buf->ReparseDataLength) + len) { in cifs_query_reparse_point()
2783 rc = -EIO; in cifs_query_reparse_point()
2787 *tag = le32_to_cpu(buf->ReparseTag); in cifs_query_reparse_point()
2788 rsp->iov_base = io_rsp; in cifs_query_reparse_point()
2789 rsp->iov_len = io_rsp_len; in cifs_query_reparse_point()
2809 cifs_dbg(FYI, "Set compression for %u\n", fid); in CIFSSMB_set_compression()
2815 pSMB->compression_state = cpu_to_le16(COMPRESSION_FORMAT_DEFAULT); in CIFSSMB_set_compression()
2817 pSMB->TotalParameterCount = 0; in CIFSSMB_set_compression()
2818 pSMB->TotalDataCount = cpu_to_le32(2); in CIFSSMB_set_compression()
2819 pSMB->MaxParameterCount = 0; in CIFSSMB_set_compression()
2820 pSMB->MaxDataCount = 0; in CIFSSMB_set_compression()
2821 pSMB->MaxSetupCount = 4; in CIFSSMB_set_compression()
2822 pSMB->Reserved = 0; in CIFSSMB_set_compression()
2823 pSMB->ParameterOffset = 0; in CIFSSMB_set_compression()
2824 pSMB->DataCount = cpu_to_le32(2); in CIFSSMB_set_compression()
2825 pSMB->DataOffset = in CIFSSMB_set_compression()
2827 compression_state) - 4); /* 84 */ in CIFSSMB_set_compression()
2828 pSMB->SetupCount = 4; in CIFSSMB_set_compression()
2829 pSMB->SubCommand = cpu_to_le16(NT_TRANSACT_IOCTL); in CIFSSMB_set_compression()
2830 pSMB->ParameterCount = 0; in CIFSSMB_set_compression()
2831 pSMB->FunctionCode = cpu_to_le32(FSCTL_SET_COMPRESSION); in CIFSSMB_set_compression()
2832 pSMB->IsFsctl = 1; /* FSCTL */ in CIFSSMB_set_compression()
2833 pSMB->IsRootFlag = 0; in CIFSSMB_set_compression()
2834 pSMB->Fid = fid; /* file handle always le */ in CIFSSMB_set_compression()
2836 pSMB->ByteCount = cpu_to_le16(5); in CIFSSMB_set_compression()
2839 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMB_set_compression()
2847 * Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMB_set_compression()
2858 * cifs_init_posix_acl - convert ACL from cifs to POSIX ACL format
2871 ace->e_perm = cifs_ace->cifs_e_perm; in cifs_init_posix_acl()
2872 ace->e_tag = cifs_ace->cifs_e_tag; in cifs_init_posix_acl()
2874 switch (ace->e_tag) { in cifs_init_posix_acl()
2876 ace->e_uid = make_kuid(&init_user_ns, in cifs_init_posix_acl()
2877 le64_to_cpu(cifs_ace->cifs_uid)); in cifs_init_posix_acl()
2880 ace->e_gid = make_kgid(&init_user_ns, in cifs_init_posix_acl()
2881 le64_to_cpu(cifs_ace->cifs_uid)); in cifs_init_posix_acl()
2888 * cifs_to_posix_acl - copy cifs ACL format to POSIX ACL format
2908 if (le16_to_cpu(cifs_acl->version) != CIFS_ACL_VERSION) in cifs_to_posix_acl()
2909 return -EOPNOTSUPP; in cifs_to_posix_acl()
2912 count = le16_to_cpu(cifs_acl->access_entry_count); in cifs_to_posix_acl()
2913 pACE = &cifs_acl->ace_array[0]; in cifs_to_posix_acl()
2920 return -EINVAL; in cifs_to_posix_acl()
2923 count = le16_to_cpu(cifs_acl->access_entry_count); in cifs_to_posix_acl()
2926 /* skip past access ACEs to get to default ACEs */ in cifs_to_posix_acl()
2927 pACE = &cifs_acl->ace_array[count]; in cifs_to_posix_acl()
2928 count = le16_to_cpu(cifs_acl->default_entry_count); in cifs_to_posix_acl()
2932 return -EINVAL; in cifs_to_posix_acl()
2935 return -EINVAL; in cifs_to_posix_acl()
2941 return -ENOMEM; in cifs_to_posix_acl()
2953 * cifs_init_ace - convert ACL entry from POSIX ACL to cifs format
2960 cifs_ace->cifs_e_perm = local_ace->e_perm; in cifs_init_ace()
2961 cifs_ace->cifs_e_tag = local_ace->e_tag; in cifs_init_ace()
2963 switch (local_ace->e_tag) { in cifs_init_ace()
2965 cifs_ace->cifs_uid = in cifs_init_ace()
2966 cpu_to_le64(from_kuid(&init_user_ns, local_ace->e_uid)); in cifs_init_ace()
2969 cifs_ace->cifs_uid = in cifs_init_ace()
2970 cpu_to_le64(from_kgid(&init_user_ns, local_ace->e_gid)); in cifs_init_ace()
2973 cifs_ace->cifs_uid = cpu_to_le64(-1); in cifs_init_ace()
2978 * posix_acl_to_cifs - convert ACLs from POSIX ACL to cifs format
2997 count = acl->a_count; in posix_acl_to_cifs()
3007 cifs_acl->version = cpu_to_le16(1); in posix_acl_to_cifs()
3009 cifs_acl->access_entry_count = cpu_to_le16(count); in posix_acl_to_cifs()
3010 cifs_acl->default_entry_count = cpu_to_le16(0xFFFF); in posix_acl_to_cifs()
3012 cifs_acl->default_entry_count = cpu_to_le16(count); in posix_acl_to_cifs()
3013 cifs_acl->access_entry_count = cpu_to_le16(0xFFFF); in posix_acl_to_cifs()
3019 cifs_init_ace(&cifs_acl->ace_array[i++], pa); in posix_acl_to_cifs()
3050 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in cifs_do_get_acl()
3052 cifsConvertToUTF16((__le16 *) pSMB->FileName, in cifs_do_get_acl()
3057 pSMB->FileName[name_len] = 0; in cifs_do_get_acl()
3058 pSMB->FileName[name_len+1] = 0; in cifs_do_get_acl()
3060 name_len = copy_path_name(pSMB->FileName, searchName); in cifs_do_get_acl()
3064 pSMB->TotalDataCount = 0; in cifs_do_get_acl()
3065 pSMB->MaxParameterCount = cpu_to_le16(2); in cifs_do_get_acl()
3067 pSMB->MaxDataCount = cpu_to_le16(4000); in cifs_do_get_acl()
3068 pSMB->MaxSetupCount = 0; in cifs_do_get_acl()
3069 pSMB->Reserved = 0; in cifs_do_get_acl()
3070 pSMB->Flags = 0; in cifs_do_get_acl()
3071 pSMB->Timeout = 0; in cifs_do_get_acl()
3072 pSMB->Reserved2 = 0; in cifs_do_get_acl()
3073 pSMB->ParameterOffset = cpu_to_le16( in cifs_do_get_acl()
3075 InformationLevel) - 4); in cifs_do_get_acl()
3076 pSMB->DataCount = 0; in cifs_do_get_acl()
3077 pSMB->DataOffset = 0; in cifs_do_get_acl()
3078 pSMB->SetupCount = 1; in cifs_do_get_acl()
3079 pSMB->Reserved3 = 0; in cifs_do_get_acl()
3080 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in cifs_do_get_acl()
3082 pSMB->TotalParameterCount = cpu_to_le16(params); in cifs_do_get_acl()
3083 pSMB->ParameterCount = pSMB->TotalParameterCount; in cifs_do_get_acl()
3084 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_POSIX_ACL); in cifs_do_get_acl()
3085 pSMB->Reserved4 = 0; in cifs_do_get_acl()
3087 pSMB->ByteCount = cpu_to_le16(byte_count); in cifs_do_get_acl()
3089 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in cifs_do_get_acl()
3091 cifs_stats_inc(&tcon->stats.cifs_stats.num_acl_get); in cifs_do_get_acl()
3099 if (rc || get_bcc(&pSMBr->hdr) < 2) in cifs_do_get_acl()
3100 rc = -EIO; /* bad smb */ in cifs_do_get_acl()
3102 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in cifs_do_get_acl()
3103 __u16 count = le16_to_cpu(pSMBr->t2.DataCount); in cifs_do_get_acl()
3105 (char *)&pSMBr->hdr.Protocol+data_offset, in cifs_do_get_acl()
3115 if (rc == -EAGAIN) in cifs_do_get_acl()
3139 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in cifs_do_set_acl()
3141 cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, in cifs_do_set_acl()
3146 name_len = copy_path_name(pSMB->FileName, fileName); in cifs_do_set_acl()
3149 pSMB->MaxParameterCount = cpu_to_le16(2); in cifs_do_set_acl()
3151 pSMB->MaxDataCount = cpu_to_le16(1000); in cifs_do_set_acl()
3152 pSMB->MaxSetupCount = 0; in cifs_do_set_acl()
3153 pSMB->Reserved = 0; in cifs_do_set_acl()
3154 pSMB->Flags = 0; in cifs_do_set_acl()
3155 pSMB->Timeout = 0; in cifs_do_set_acl()
3156 pSMB->Reserved2 = 0; in cifs_do_set_acl()
3158 InformationLevel) - 4; in cifs_do_set_acl()
3160 parm_data = ((char *)pSMB) + sizeof(pSMB->hdr.smb_buf_length) + offset; in cifs_do_set_acl()
3161 pSMB->ParameterOffset = cpu_to_le16(param_offset); in cifs_do_set_acl()
3167 rc = -EOPNOTSUPP; in cifs_do_set_acl()
3170 pSMB->DataOffset = cpu_to_le16(offset); in cifs_do_set_acl()
3171 pSMB->SetupCount = 1; in cifs_do_set_acl()
3172 pSMB->Reserved3 = 0; in cifs_do_set_acl()
3173 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in cifs_do_set_acl()
3174 pSMB->InformationLevel = cpu_to_le16(SMB_SET_POSIX_ACL); in cifs_do_set_acl()
3176 pSMB->DataCount = cpu_to_le16(data_count); in cifs_do_set_acl()
3177 pSMB->TotalDataCount = pSMB->DataCount; in cifs_do_set_acl()
3178 pSMB->ParameterCount = cpu_to_le16(params); in cifs_do_set_acl()
3179 pSMB->TotalParameterCount = pSMB->ParameterCount; in cifs_do_set_acl()
3180 pSMB->Reserved4 = 0; in cifs_do_set_acl()
3182 pSMB->ByteCount = cpu_to_le16(byte_count); in cifs_do_set_acl()
3183 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in cifs_do_set_acl()
3186 cifs_dbg(FYI, "Set POSIX ACL returned %d\n", rc); in cifs_do_set_acl()
3190 if (rc == -EAGAIN) in cifs_do_set_acl()
3200 return -EOPNOTSUPP; in cifs_do_get_acl()
3208 return -EOPNOTSUPP; in cifs_do_set_acl()
3224 return -ENODEV; in CIFSGetExtAttr()
3233 pSMB->t2.TotalDataCount = 0; in CIFSGetExtAttr()
3234 pSMB->t2.MaxParameterCount = cpu_to_le16(4); in CIFSGetExtAttr()
3236 pSMB->t2.MaxDataCount = cpu_to_le16(4000); in CIFSGetExtAttr()
3237 pSMB->t2.MaxSetupCount = 0; in CIFSGetExtAttr()
3238 pSMB->t2.Reserved = 0; in CIFSGetExtAttr()
3239 pSMB->t2.Flags = 0; in CIFSGetExtAttr()
3240 pSMB->t2.Timeout = 0; in CIFSGetExtAttr()
3241 pSMB->t2.Reserved2 = 0; in CIFSGetExtAttr()
3242 pSMB->t2.ParameterOffset = cpu_to_le16(offsetof(struct smb_t2_qfi_req, in CIFSGetExtAttr()
3243 Fid) - 4); in CIFSGetExtAttr()
3244 pSMB->t2.DataCount = 0; in CIFSGetExtAttr()
3245 pSMB->t2.DataOffset = 0; in CIFSGetExtAttr()
3246 pSMB->t2.SetupCount = 1; in CIFSGetExtAttr()
3247 pSMB->t2.Reserved3 = 0; in CIFSGetExtAttr()
3248 pSMB->t2.SubCommand = cpu_to_le16(TRANS2_QUERY_FILE_INFORMATION); in CIFSGetExtAttr()
3250 pSMB->t2.TotalParameterCount = cpu_to_le16(params); in CIFSGetExtAttr()
3251 pSMB->t2.ParameterCount = pSMB->t2.TotalParameterCount; in CIFSGetExtAttr()
3252 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_ATTR_FLAGS); in CIFSGetExtAttr()
3253 pSMB->Pad = 0; in CIFSGetExtAttr()
3254 pSMB->Fid = netfid; in CIFSGetExtAttr()
3256 pSMB->t2.ByteCount = cpu_to_le16(byte_count); in CIFSGetExtAttr()
3258 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSGetExtAttr()
3266 if (rc || get_bcc(&pSMBr->hdr) < 2) in CIFSGetExtAttr()
3269 rc = -EIO; /* bad smb */ in CIFSGetExtAttr()
3271 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSGetExtAttr()
3272 __u16 count = le16_to_cpu(pSMBr->t2.DataCount); in CIFSGetExtAttr()
3277 rc = -EIO; in CIFSGetExtAttr()
3281 (data_offset + (char *) &pSMBr->hdr.Protocol); in CIFSGetExtAttr()
3282 *pExtAttrBits = le64_to_cpu(pfinfo->mode); in CIFSGetExtAttr()
3283 *pMask = le64_to_cpu(pfinfo->mask); in CIFSGetExtAttr()
3288 if (rc == -EAGAIN) in CIFSGetExtAttr()
3300 * returned setup area) and MaxParameterCount (returned parms size) must be set
3317 pSMB->Reserved = 0; in smb_init_nttransact()
3318 pSMB->TotalParameterCount = cpu_to_le32(parm_len); in smb_init_nttransact()
3319 pSMB->TotalDataCount = 0; in smb_init_nttransact()
3320 pSMB->MaxDataCount = cpu_to_le32(CIFSMaxBufSize & 0xFFFFFF00); in smb_init_nttransact()
3321 pSMB->ParameterCount = pSMB->TotalParameterCount; in smb_init_nttransact()
3322 pSMB->DataCount = pSMB->TotalDataCount; in smb_init_nttransact()
3324 (setup_count * 2) - 4 /* for rfc1001 length itself */; in smb_init_nttransact()
3325 pSMB->ParameterOffset = cpu_to_le32(temp_offset); in smb_init_nttransact()
3326 pSMB->DataOffset = cpu_to_le32(temp_offset + parm_len); in smb_init_nttransact()
3327 pSMB->SetupCount = setup_count; /* no need to le convert byte fields */ in smb_init_nttransact()
3328 pSMB->SubCommand = cpu_to_le16(sub_command); in smb_init_nttransact()
3345 return -EINVAL; in validate_ntransact()
3349 bcc = get_bcc(&pSMBr->hdr); in validate_ntransact()
3351 (char *)&pSMBr->ByteCount; in validate_ntransact()
3353 data_offset = le32_to_cpu(pSMBr->DataOffset); in validate_ntransact()
3354 data_count = le32_to_cpu(pSMBr->DataCount); in validate_ntransact()
3355 parm_offset = le32_to_cpu(pSMBr->ParameterOffset); in validate_ntransact()
3356 parm_count = le32_to_cpu(pSMBr->ParameterCount); in validate_ntransact()
3358 *ppparm = (char *)&pSMBr->hdr.Protocol + parm_offset; in validate_ntransact()
3359 *ppdata = (char *)&pSMBr->hdr.Protocol + data_offset; in validate_ntransact()
3364 return -EINVAL; in validate_ntransact()
3367 return -EINVAL; in validate_ntransact()
3370 return -EINVAL; in validate_ntransact()
3375 return -EINVAL; in validate_ntransact()
3378 return -EINVAL; in validate_ntransact()
3406 pSMB->MaxParameterCount = cpu_to_le32(4); in CIFSSMBGetCIFSACL()
3408 pSMB->MaxSetupCount = 0; in CIFSSMBGetCIFSACL()
3409 pSMB->Fid = fid; /* file handle always le */ in CIFSSMBGetCIFSACL()
3410 pSMB->AclFlags = cpu_to_le32(CIFS_ACL_OWNER | CIFS_ACL_GROUP | in CIFSSMBGetCIFSACL()
3412 pSMB->ByteCount = cpu_to_le16(11); /* 3 bytes pad + 8 bytes parm */ in CIFSSMBGetCIFSACL()
3415 iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4; in CIFSSMBGetCIFSACL()
3417 rc = SendReceive2(xid, tcon->ses, iov, 1 /* num iovec */, &buf_type, in CIFSSMBGetCIFSACL()
3420 cifs_stats_inc(&tcon->stats.cifs_stats.num_acl_get); in CIFSSMBGetCIFSACL()
3440 if (le32_to_cpu(pSMBr->ParameterCount) != 4) { in CIFSSMBGetCIFSACL()
3441 rc = -EIO; /* bad smb */ in CIFSSMBGetCIFSACL()
3461 rc = -EINVAL; in CIFSSMBGetCIFSACL()
3467 rc = -ENOMEM; in CIFSSMBGetCIFSACL()
3491 pSMB->MaxSetupCount = 0; in CIFSSMBSetCIFSACL()
3492 pSMB->Reserved = 0; in CIFSSMBSetCIFSACL()
3495 param_offset = offsetof(struct smb_com_transaction_ssec_req, Fid) - 4; in CIFSSMBSetCIFSACL()
3500 pSMB->DataCount = cpu_to_le32(data_count); in CIFSSMBSetCIFSACL()
3501 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetCIFSACL()
3502 pSMB->MaxParameterCount = cpu_to_le32(4); in CIFSSMBSetCIFSACL()
3503 pSMB->MaxDataCount = cpu_to_le32(16384); in CIFSSMBSetCIFSACL()
3504 pSMB->ParameterCount = cpu_to_le32(param_count); in CIFSSMBSetCIFSACL()
3505 pSMB->ParameterOffset = cpu_to_le32(param_offset); in CIFSSMBSetCIFSACL()
3506 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetCIFSACL()
3507 pSMB->DataOffset = cpu_to_le32(data_offset); in CIFSSMBSetCIFSACL()
3508 pSMB->SetupCount = 0; in CIFSSMBSetCIFSACL()
3509 pSMB->SubCommand = cpu_to_le16(NT_TRANSACT_SET_SECURITY_DESC); in CIFSSMBSetCIFSACL()
3510 pSMB->ByteCount = cpu_to_le16(byte_count+data_count); in CIFSSMBSetCIFSACL()
3512 pSMB->Fid = fid; /* file handle always le */ in CIFSSMBSetCIFSACL()
3513 pSMB->Reserved2 = 0; in CIFSSMBSetCIFSACL()
3514 pSMB->AclFlags = cpu_to_le32(aclflag); in CIFSSMBSetCIFSACL()
3523 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetCIFSACL()
3529 cifs_dbg(FYI, "Set CIFS ACL returned %d\n", rc); in CIFSSMBSetCIFSACL()
3532 if (rc == -EAGAIN) in CIFSSMBSetCIFSACL()
3559 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in SMBQueryInformation()
3561 cifsConvertToUTF16((__le16 *) pSMB->FileName, in SMBQueryInformation()
3567 name_len = copy_path_name(pSMB->FileName, search_name); in SMBQueryInformation()
3569 pSMB->BufferFormat = 0x04; in SMBQueryInformation()
3572 pSMB->ByteCount = cpu_to_le16(name_len); in SMBQueryInformation()
3574 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in SMBQueryInformation()
3580 __u32 time = le32_to_cpu(pSMBr->last_write_time); in SMBQueryInformation()
3583 /* BB FIXME - add time zone adjustment BB */ in SMBQueryInformation()
3588 data->ChangeTime = cpu_to_le64(cifs_UnixTimeToNT(ts)); in SMBQueryInformation()
3589 data->LastWriteTime = data->ChangeTime; in SMBQueryInformation()
3590 data->LastAccessTime = 0; in SMBQueryInformation()
3591 data->AllocationSize = in SMBQueryInformation()
3592 cpu_to_le64(le32_to_cpu(pSMBr->size)); in SMBQueryInformation()
3593 data->EndOfFile = data->AllocationSize; in SMBQueryInformation()
3594 data->Attributes = in SMBQueryInformation()
3595 cpu_to_le32(le16_to_cpu(pSMBr->attr)); in SMBQueryInformation()
3597 rc = -EIO; /* bad buffer passed in */ in SMBQueryInformation()
3601 if (rc == -EAGAIN) in SMBQueryInformation()
3624 pSMB->t2.TotalDataCount = 0; in CIFSSMBQFileInfo()
3625 pSMB->t2.MaxParameterCount = cpu_to_le16(4); in CIFSSMBQFileInfo()
3627 pSMB->t2.MaxDataCount = cpu_to_le16(CIFSMaxBufSize); in CIFSSMBQFileInfo()
3628 pSMB->t2.MaxSetupCount = 0; in CIFSSMBQFileInfo()
3629 pSMB->t2.Reserved = 0; in CIFSSMBQFileInfo()
3630 pSMB->t2.Flags = 0; in CIFSSMBQFileInfo()
3631 pSMB->t2.Timeout = 0; in CIFSSMBQFileInfo()
3632 pSMB->t2.Reserved2 = 0; in CIFSSMBQFileInfo()
3633 pSMB->t2.ParameterOffset = cpu_to_le16(offsetof(struct smb_t2_qfi_req, in CIFSSMBQFileInfo()
3634 Fid) - 4); in CIFSSMBQFileInfo()
3635 pSMB->t2.DataCount = 0; in CIFSSMBQFileInfo()
3636 pSMB->t2.DataOffset = 0; in CIFSSMBQFileInfo()
3637 pSMB->t2.SetupCount = 1; in CIFSSMBQFileInfo()
3638 pSMB->t2.Reserved3 = 0; in CIFSSMBQFileInfo()
3639 pSMB->t2.SubCommand = cpu_to_le16(TRANS2_QUERY_FILE_INFORMATION); in CIFSSMBQFileInfo()
3641 pSMB->t2.TotalParameterCount = cpu_to_le16(params); in CIFSSMBQFileInfo()
3642 pSMB->t2.ParameterCount = pSMB->t2.TotalParameterCount; in CIFSSMBQFileInfo()
3643 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_ALL_INFO); in CIFSSMBQFileInfo()
3644 pSMB->Pad = 0; in CIFSSMBQFileInfo()
3645 pSMB->Fid = netfid; in CIFSSMBQFileInfo()
3647 pSMB->t2.ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFileInfo()
3649 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFileInfo()
3657 rc = -EIO; in CIFSSMBQFileInfo()
3658 else if (get_bcc(&pSMBr->hdr) < 40) in CIFSSMBQFileInfo()
3659 rc = -EIO; /* bad smb */ in CIFSSMBQFileInfo()
3661 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFileInfo()
3663 (char *) &pSMBr->hdr.Protocol + in CIFSSMBQFileInfo()
3666 rc = -ENOMEM; in CIFSSMBQFileInfo()
3669 if (rc == -EAGAIN) in CIFSSMBQFileInfo()
3696 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBQPathInfo()
3698 cifsConvertToUTF16((__le16 *) pSMB->FileName, search_name, in CIFSSMBQPathInfo()
3703 name_len = copy_path_name(pSMB->FileName, search_name); in CIFSSMBQPathInfo()
3707 pSMB->TotalDataCount = 0; in CIFSSMBQPathInfo()
3708 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQPathInfo()
3710 pSMB->MaxDataCount = cpu_to_le16(4000); in CIFSSMBQPathInfo()
3711 pSMB->MaxSetupCount = 0; in CIFSSMBQPathInfo()
3712 pSMB->Reserved = 0; in CIFSSMBQPathInfo()
3713 pSMB->Flags = 0; in CIFSSMBQPathInfo()
3714 pSMB->Timeout = 0; in CIFSSMBQPathInfo()
3715 pSMB->Reserved2 = 0; in CIFSSMBQPathInfo()
3716 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQPathInfo()
3717 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSSMBQPathInfo()
3718 pSMB->DataCount = 0; in CIFSSMBQPathInfo()
3719 pSMB->DataOffset = 0; in CIFSSMBQPathInfo()
3720 pSMB->SetupCount = 1; in CIFSSMBQPathInfo()
3721 pSMB->Reserved3 = 0; in CIFSSMBQPathInfo()
3722 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSSMBQPathInfo()
3724 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQPathInfo()
3725 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQPathInfo()
3727 pSMB->InformationLevel = cpu_to_le16(SMB_INFO_STANDARD); in CIFSSMBQPathInfo()
3729 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_ALL_INFO); in CIFSSMBQPathInfo()
3730 pSMB->Reserved4 = 0; in CIFSSMBQPathInfo()
3732 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQPathInfo()
3734 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQPathInfo()
3742 rc = -EIO; in CIFSSMBQPathInfo()
3743 else if (!legacy && get_bcc(&pSMBr->hdr) < 40) in CIFSSMBQPathInfo()
3744 rc = -EIO; /* bad smb */ in CIFSSMBQPathInfo()
3745 else if (legacy && get_bcc(&pSMBr->hdr) < 24) in CIFSSMBQPathInfo()
3746 rc = -EIO; /* 24 or 26 expected but we do not read in CIFSSMBQPathInfo()
3750 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQPathInfo()
3755 * also note it differs on Set vs Get, ie two bytes or 4 in CIFSSMBQPathInfo()
3762 memcpy((char *) data, (char *) &pSMBr->hdr.Protocol + in CIFSSMBQPathInfo()
3765 rc = -ENOMEM; in CIFSSMBQPathInfo()
3768 if (rc == -EAGAIN) in CIFSSMBQPathInfo()
3791 pSMB->t2.TotalDataCount = 0; in CIFSSMBUnixQFileInfo()
3792 pSMB->t2.MaxParameterCount = cpu_to_le16(4); in CIFSSMBUnixQFileInfo()
3794 pSMB->t2.MaxDataCount = cpu_to_le16(CIFSMaxBufSize); in CIFSSMBUnixQFileInfo()
3795 pSMB->t2.MaxSetupCount = 0; in CIFSSMBUnixQFileInfo()
3796 pSMB->t2.Reserved = 0; in CIFSSMBUnixQFileInfo()
3797 pSMB->t2.Flags = 0; in CIFSSMBUnixQFileInfo()
3798 pSMB->t2.Timeout = 0; in CIFSSMBUnixQFileInfo()
3799 pSMB->t2.Reserved2 = 0; in CIFSSMBUnixQFileInfo()
3800 pSMB->t2.ParameterOffset = cpu_to_le16(offsetof(struct smb_t2_qfi_req, in CIFSSMBUnixQFileInfo()
3801 Fid) - 4); in CIFSSMBUnixQFileInfo()
3802 pSMB->t2.DataCount = 0; in CIFSSMBUnixQFileInfo()
3803 pSMB->t2.DataOffset = 0; in CIFSSMBUnixQFileInfo()
3804 pSMB->t2.SetupCount = 1; in CIFSSMBUnixQFileInfo()
3805 pSMB->t2.Reserved3 = 0; in CIFSSMBUnixQFileInfo()
3806 pSMB->t2.SubCommand = cpu_to_le16(TRANS2_QUERY_FILE_INFORMATION); in CIFSSMBUnixQFileInfo()
3808 pSMB->t2.TotalParameterCount = cpu_to_le16(params); in CIFSSMBUnixQFileInfo()
3809 pSMB->t2.ParameterCount = pSMB->t2.TotalParameterCount; in CIFSSMBUnixQFileInfo()
3810 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC); in CIFSSMBUnixQFileInfo()
3811 pSMB->Pad = 0; in CIFSSMBUnixQFileInfo()
3812 pSMB->Fid = netfid; in CIFSSMBUnixQFileInfo()
3814 pSMB->t2.ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixQFileInfo()
3816 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBUnixQFileInfo()
3823 if (rc || get_bcc(&pSMBr->hdr) < sizeof(FILE_UNIX_BASIC_INFO)) { in CIFSSMBUnixQFileInfo()
3825 rc = -EIO; /* bad smb */ in CIFSSMBUnixQFileInfo()
3827 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBUnixQFileInfo()
3829 (char *) &pSMBr->hdr.Protocol + in CIFSSMBUnixQFileInfo()
3836 if (rc == -EAGAIN) in CIFSSMBUnixQFileInfo()
3863 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBUnixQPathInfo()
3865 cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, in CIFSSMBUnixQPathInfo()
3870 name_len = copy_path_name(pSMB->FileName, searchName); in CIFSSMBUnixQPathInfo()
3874 pSMB->TotalDataCount = 0; in CIFSSMBUnixQPathInfo()
3875 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBUnixQPathInfo()
3877 pSMB->MaxDataCount = cpu_to_le16(4000); in CIFSSMBUnixQPathInfo()
3878 pSMB->MaxSetupCount = 0; in CIFSSMBUnixQPathInfo()
3879 pSMB->Reserved = 0; in CIFSSMBUnixQPathInfo()
3880 pSMB->Flags = 0; in CIFSSMBUnixQPathInfo()
3881 pSMB->Timeout = 0; in CIFSSMBUnixQPathInfo()
3882 pSMB->Reserved2 = 0; in CIFSSMBUnixQPathInfo()
3883 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBUnixQPathInfo()
3884 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSSMBUnixQPathInfo()
3885 pSMB->DataCount = 0; in CIFSSMBUnixQPathInfo()
3886 pSMB->DataOffset = 0; in CIFSSMBUnixQPathInfo()
3887 pSMB->SetupCount = 1; in CIFSSMBUnixQPathInfo()
3888 pSMB->Reserved3 = 0; in CIFSSMBUnixQPathInfo()
3889 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSSMBUnixQPathInfo()
3891 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBUnixQPathInfo()
3892 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBUnixQPathInfo()
3893 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC); in CIFSSMBUnixQPathInfo()
3894 pSMB->Reserved4 = 0; in CIFSSMBUnixQPathInfo()
3896 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixQPathInfo()
3898 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBUnixQPathInfo()
3905 if (rc || get_bcc(&pSMBr->hdr) < sizeof(FILE_UNIX_BASIC_INFO)) { in CIFSSMBUnixQPathInfo()
3907 rc = -EIO; /* bad smb */ in CIFSSMBUnixQPathInfo()
3909 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBUnixQPathInfo()
3911 (char *) &pSMBr->hdr.Protocol + in CIFSSMBUnixQPathInfo()
3917 if (rc == -EAGAIN) in CIFSSMBUnixQPathInfo()
3949 nls_codepage = cifs_sb->local_nls; in CIFSFindFirst()
3952 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSFindFirst()
3954 cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, in CIFSFindFirst()
3961 pSMB->FileName[name_len] = CIFS_DIR_SEP(cifs_sb); in CIFSFindFirst()
3962 pSMB->FileName[name_len+1] = 0; in CIFSFindFirst()
3963 pSMB->FileName[name_len+2] = '*'; in CIFSFindFirst()
3964 pSMB->FileName[name_len+3] = 0; in CIFSFindFirst()
3967 pSMB->FileName[name_len] = 0; in CIFSFindFirst()
3968 pSMB->FileName[name_len+1] = 0; in CIFSFindFirst()
3972 name_len = copy_path_name(pSMB->FileName, searchName); in CIFSFindFirst()
3974 if (WARN_ON_ONCE(name_len > PATH_MAX-2)) in CIFSFindFirst()
3975 name_len = PATH_MAX-2; in CIFSFindFirst()
3977 pSMB->FileName[name_len-1] = CIFS_DIR_SEP(cifs_sb); in CIFSFindFirst()
3978 pSMB->FileName[name_len] = '*'; in CIFSFindFirst()
3979 pSMB->FileName[name_len+1] = 0; in CIFSFindFirst()
3985 pSMB->TotalDataCount = 0; /* no EAs */ in CIFSFindFirst()
3986 pSMB->MaxParameterCount = cpu_to_le16(10); in CIFSFindFirst()
3987 pSMB->MaxDataCount = cpu_to_le16(CIFSMaxBufSize & 0xFFFFFF00); in CIFSFindFirst()
3988 pSMB->MaxSetupCount = 0; in CIFSFindFirst()
3989 pSMB->Reserved = 0; in CIFSFindFirst()
3990 pSMB->Flags = 0; in CIFSFindFirst()
3991 pSMB->Timeout = 0; in CIFSFindFirst()
3992 pSMB->Reserved2 = 0; in CIFSFindFirst()
3994 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSFindFirst()
3995 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSFindFirst()
3996 pSMB->ParameterOffset = cpu_to_le16( in CIFSFindFirst()
3998 - 4); in CIFSFindFirst()
3999 pSMB->DataCount = 0; in CIFSFindFirst()
4000 pSMB->DataOffset = 0; in CIFSFindFirst()
4001 pSMB->SetupCount = 1; /* one byte, no need to make endian neutral */ in CIFSFindFirst()
4002 pSMB->Reserved3 = 0; in CIFSFindFirst()
4003 pSMB->SubCommand = cpu_to_le16(TRANS2_FIND_FIRST); in CIFSFindFirst()
4004 pSMB->SearchAttributes = in CIFSFindFirst()
4007 pSMB->SearchCount = cpu_to_le16(CIFSMaxBufSize/sizeof(FILE_UNIX_INFO)); in CIFSFindFirst()
4008 pSMB->SearchFlags = cpu_to_le16(search_flags); in CIFSFindFirst()
4009 pSMB->InformationLevel = cpu_to_le16(psrch_inf->info_level); in CIFSFindFirst()
4011 /* BB what should we set StorageType to? Does it matter? BB */ in CIFSFindFirst()
4012 pSMB->SearchStorageType = 0; in CIFSFindFirst()
4014 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSFindFirst()
4016 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSFindFirst()
4018 cifs_stats_inc(&tcon->stats.cifs_stats.num_ffirst); in CIFSFindFirst()
4032 if (rc == -EAGAIN) in CIFSFindFirst()
4043 psrch_inf->unicode = !!(pSMBr->hdr.Flags2 & SMBFLG2_UNICODE); in CIFSFindFirst()
4044 psrch_inf->ntwrk_buf_start = (char *)pSMBr; in CIFSFindFirst()
4045 psrch_inf->smallBuf = false; in CIFSFindFirst()
4046 psrch_inf->srch_entries_start = (char *)&pSMBr->hdr.Protocol + in CIFSFindFirst()
4047 le16_to_cpu(pSMBr->t2.DataOffset); in CIFSFindFirst()
4049 parms = (T2_FFIRST_RSP_PARMS *)((char *)&pSMBr->hdr.Protocol + in CIFSFindFirst()
4050 le16_to_cpu(pSMBr->t2.ParameterOffset)); in CIFSFindFirst()
4051 psrch_inf->endOfSearch = !!parms->EndofSearch; in CIFSFindFirst()
4053 psrch_inf->entries_in_buffer = le16_to_cpu(parms->SearchCount); in CIFSFindFirst()
4054 psrch_inf->index_of_last_entry = 2 /* skip . and .. */ + in CIFSFindFirst()
4055 psrch_inf->entries_in_buffer; in CIFSFindFirst()
4056 lnoff = le16_to_cpu(parms->LastNameOffset); in CIFSFindFirst()
4059 psrch_inf->last_entry = NULL; in CIFSFindFirst()
4061 psrch_inf->last_entry = psrch_inf->srch_entries_start + lnoff; in CIFSFindFirst()
4063 *pnetfid = parms->SearchHandle; in CIFSFindFirst()
4084 if (psrch_inf->endOfSearch) in CIFSFindNext()
4085 return -ENOENT; in CIFSFindNext()
4094 pSMB->TotalDataCount = 0; /* no EAs */ in CIFSFindNext()
4095 pSMB->MaxParameterCount = cpu_to_le16(8); in CIFSFindNext()
4096 pSMB->MaxDataCount = cpu_to_le16(CIFSMaxBufSize & 0xFFFFFF00); in CIFSFindNext()
4097 pSMB->MaxSetupCount = 0; in CIFSFindNext()
4098 pSMB->Reserved = 0; in CIFSFindNext()
4099 pSMB->Flags = 0; in CIFSFindNext()
4100 pSMB->Timeout = 0; in CIFSFindNext()
4101 pSMB->Reserved2 = 0; in CIFSFindNext()
4102 pSMB->ParameterOffset = cpu_to_le16( in CIFSFindNext()
4103 offsetof(struct smb_com_transaction2_fnext_req,SearchHandle) - 4); in CIFSFindNext()
4104 pSMB->DataCount = 0; in CIFSFindNext()
4105 pSMB->DataOffset = 0; in CIFSFindNext()
4106 pSMB->SetupCount = 1; in CIFSFindNext()
4107 pSMB->Reserved3 = 0; in CIFSFindNext()
4108 pSMB->SubCommand = cpu_to_le16(TRANS2_FIND_NEXT); in CIFSFindNext()
4109 pSMB->SearchHandle = searchHandle; /* always kept as le */ in CIFSFindNext()
4110 pSMB->SearchCount = in CIFSFindNext()
4112 pSMB->InformationLevel = cpu_to_le16(psrch_inf->info_level); in CIFSFindNext()
4113 pSMB->ResumeKey = psrch_inf->resume_key; in CIFSFindNext()
4114 pSMB->SearchFlags = cpu_to_le16(search_flags); in CIFSFindNext()
4116 name_len = psrch_inf->resume_name_len; in CIFSFindNext()
4119 memcpy(pSMB->ResumeFileName, psrch_inf->presume_name, name_len); in CIFSFindNext()
4122 pSMB->ResumeFileName[name_len] = 0; in CIFSFindNext()
4123 pSMB->ResumeFileName[name_len+1] = 0; in CIFSFindNext()
4126 return -EINVAL; in CIFSFindNext()
4129 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSFindNext()
4130 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSFindNext()
4132 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSFindNext()
4134 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSFindNext()
4136 cifs_stats_inc(&tcon->stats.cifs_stats.num_fnext); in CIFSFindNext()
4140 if (rc == -EBADF) { in CIFSFindNext()
4141 psrch_inf->endOfSearch = true; in CIFSFindNext()
4156 psrch_inf->unicode = !!(pSMBr->hdr.Flags2 & SMBFLG2_UNICODE); in CIFSFindNext()
4157 response_data = (char *)&pSMBr->hdr.Protocol + in CIFSFindNext()
4158 le16_to_cpu(pSMBr->t2.ParameterOffset); in CIFSFindNext()
4160 response_data = (char *)&pSMBr->hdr.Protocol + in CIFSFindNext()
4161 le16_to_cpu(pSMBr->t2.DataOffset); in CIFSFindNext()
4163 if (psrch_inf->smallBuf) in CIFSFindNext()
4164 cifs_small_buf_release(psrch_inf->ntwrk_buf_start); in CIFSFindNext()
4166 cifs_buf_release(psrch_inf->ntwrk_buf_start); in CIFSFindNext()
4168 psrch_inf->srch_entries_start = response_data; in CIFSFindNext()
4169 psrch_inf->ntwrk_buf_start = (char *)pSMB; in CIFSFindNext()
4170 psrch_inf->smallBuf = false; in CIFSFindNext()
4171 psrch_inf->endOfSearch = !!parms->EndofSearch; in CIFSFindNext()
4172 psrch_inf->entries_in_buffer = le16_to_cpu(parms->SearchCount); in CIFSFindNext()
4173 psrch_inf->index_of_last_entry += psrch_inf->entries_in_buffer; in CIFSFindNext()
4174 lnoff = le16_to_cpu(parms->LastNameOffset); in CIFSFindNext()
4177 psrch_inf->last_entry = NULL; in CIFSFindNext()
4179 psrch_inf->last_entry = in CIFSFindNext()
4180 psrch_inf->srch_entries_start + lnoff; in CIFSFindNext()
4188 * Note: On -EAGAIN error only caller can retry on handle based calls in CIFSFindNext()
4206 if (rc == -EAGAIN) in CIFSFindClose()
4211 pSMB->FileID = searchHandle; in CIFSFindClose()
4212 pSMB->ByteCount = 0; in CIFSFindClose()
4213 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSFindClose()
4218 cifs_stats_inc(&tcon->stats.cifs_stats.num_fclose); in CIFSFindClose()
4221 if (rc == -EAGAIN) in CIFSFindClose()
4240 return -ENODEV; in CIFSGetSrvInodeNumber()
4248 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSGetSrvInodeNumber()
4250 cifsConvertToUTF16((__le16 *) pSMB->FileName, in CIFSGetSrvInodeNumber()
4256 name_len = copy_path_name(pSMB->FileName, search_name); in CIFSGetSrvInodeNumber()
4260 pSMB->TotalDataCount = 0; in CIFSGetSrvInodeNumber()
4261 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSGetSrvInodeNumber()
4263 pSMB->MaxDataCount = cpu_to_le16(4000); in CIFSGetSrvInodeNumber()
4264 pSMB->MaxSetupCount = 0; in CIFSGetSrvInodeNumber()
4265 pSMB->Reserved = 0; in CIFSGetSrvInodeNumber()
4266 pSMB->Flags = 0; in CIFSGetSrvInodeNumber()
4267 pSMB->Timeout = 0; in CIFSGetSrvInodeNumber()
4268 pSMB->Reserved2 = 0; in CIFSGetSrvInodeNumber()
4269 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSGetSrvInodeNumber()
4270 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSGetSrvInodeNumber()
4271 pSMB->DataCount = 0; in CIFSGetSrvInodeNumber()
4272 pSMB->DataOffset = 0; in CIFSGetSrvInodeNumber()
4273 pSMB->SetupCount = 1; in CIFSGetSrvInodeNumber()
4274 pSMB->Reserved3 = 0; in CIFSGetSrvInodeNumber()
4275 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSGetSrvInodeNumber()
4277 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSGetSrvInodeNumber()
4278 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSGetSrvInodeNumber()
4279 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_INTERNAL_INFO); in CIFSGetSrvInodeNumber()
4280 pSMB->Reserved4 = 0; in CIFSGetSrvInodeNumber()
4282 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSGetSrvInodeNumber()
4284 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSGetSrvInodeNumber()
4292 if (rc || get_bcc(&pSMBr->hdr) < 2) in CIFSGetSrvInodeNumber()
4295 rc = -EIO; /* bad smb */ in CIFSGetSrvInodeNumber()
4297 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSGetSrvInodeNumber()
4298 __u16 count = le16_to_cpu(pSMBr->t2.DataCount); in CIFSGetSrvInodeNumber()
4303 rc = -EIO; in CIFSGetSrvInodeNumber()
4307 (data_offset + (char *) &pSMBr->hdr.Protocol); in CIFSGetSrvInodeNumber()
4308 *inode_number = le64_to_cpu(pfinfo->UniqueId); in CIFSGetSrvInodeNumber()
4313 if (rc == -EAGAIN) in CIFSGetSrvInodeNumber()
4335 if (ses == NULL || ses->tcon_ipc == NULL) in CIFSGetDFSRefer()
4336 return -ENODEV; in CIFSGetDFSRefer()
4344 rc = smb_init_no_reconnect(SMB_COM_TRANSACTION2, 15, ses->tcon_ipc, in CIFSGetDFSRefer()
4351 pSMB->hdr.Mid = get_next_mid(ses->server); in CIFSGetDFSRefer()
4352 pSMB->hdr.Tid = ses->tcon_ipc->tid; in CIFSGetDFSRefer()
4353 pSMB->hdr.Uid = ses->Suid; in CIFSGetDFSRefer()
4354 if (ses->capabilities & CAP_STATUS32) in CIFSGetDFSRefer()
4355 pSMB->hdr.Flags2 |= SMBFLG2_ERR_STATUS; in CIFSGetDFSRefer()
4356 if (ses->capabilities & CAP_DFS) in CIFSGetDFSRefer()
4357 pSMB->hdr.Flags2 |= SMBFLG2_DFS; in CIFSGetDFSRefer()
4359 if (ses->capabilities & CAP_UNICODE) { in CIFSGetDFSRefer()
4360 pSMB->hdr.Flags2 |= SMBFLG2_UNICODE; in CIFSGetDFSRefer()
4362 cifsConvertToUTF16((__le16 *) pSMB->RequestFileName, in CIFSGetDFSRefer()
4368 name_len = copy_path_name(pSMB->RequestFileName, search_name); in CIFSGetDFSRefer()
4371 if (ses->server->sign) in CIFSGetDFSRefer()
4372 pSMB->hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE; in CIFSGetDFSRefer()
4374 pSMB->hdr.Uid = ses->Suid; in CIFSGetDFSRefer()
4377 pSMB->TotalDataCount = 0; in CIFSGetDFSRefer()
4378 pSMB->DataCount = 0; in CIFSGetDFSRefer()
4379 pSMB->DataOffset = 0; in CIFSGetDFSRefer()
4380 pSMB->MaxParameterCount = 0; in CIFSGetDFSRefer()
4382 pSMB->MaxDataCount = cpu_to_le16(4000); in CIFSGetDFSRefer()
4383 pSMB->MaxSetupCount = 0; in CIFSGetDFSRefer()
4384 pSMB->Reserved = 0; in CIFSGetDFSRefer()
4385 pSMB->Flags = 0; in CIFSGetDFSRefer()
4386 pSMB->Timeout = 0; in CIFSGetDFSRefer()
4387 pSMB->Reserved2 = 0; in CIFSGetDFSRefer()
4388 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSGetDFSRefer()
4389 struct smb_com_transaction2_get_dfs_refer_req, MaxReferralLevel) - 4); in CIFSGetDFSRefer()
4390 pSMB->SetupCount = 1; in CIFSGetDFSRefer()
4391 pSMB->Reserved3 = 0; in CIFSGetDFSRefer()
4392 pSMB->SubCommand = cpu_to_le16(TRANS2_GET_DFS_REFERRAL); in CIFSGetDFSRefer()
4394 pSMB->ParameterCount = cpu_to_le16(params); in CIFSGetDFSRefer()
4395 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSGetDFSRefer()
4396 pSMB->MaxReferralLevel = cpu_to_le16(3); in CIFSGetDFSRefer()
4398 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSGetDFSRefer()
4409 if (rc || get_bcc(&pSMBr->hdr) < 17) { in CIFSGetDFSRefer()
4410 rc = -EIO; /* bad smb */ in CIFSGetDFSRefer()
4415 get_bcc(&pSMBr->hdr), le16_to_cpu(pSMBr->t2.DataOffset)); in CIFSGetDFSRefer()
4418 rc = parse_dfs_referrals(&pSMBr->dfs_data, in CIFSGetDFSRefer()
4419 le16_to_cpu(pSMBr->t2.DataCount), in CIFSGetDFSRefer()
4422 (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) != 0); in CIFSGetDFSRefer()
4427 if (rc == -EAGAIN) in CIFSGetDFSRefer()
4454 pSMB->TotalDataCount = 0; in SMBOldQFSInfo()
4455 pSMB->MaxParameterCount = cpu_to_le16(2); in SMBOldQFSInfo()
4456 pSMB->MaxDataCount = cpu_to_le16(1000); in SMBOldQFSInfo()
4457 pSMB->MaxSetupCount = 0; in SMBOldQFSInfo()
4458 pSMB->Reserved = 0; in SMBOldQFSInfo()
4459 pSMB->Flags = 0; in SMBOldQFSInfo()
4460 pSMB->Timeout = 0; in SMBOldQFSInfo()
4461 pSMB->Reserved2 = 0; in SMBOldQFSInfo()
4463 pSMB->TotalParameterCount = cpu_to_le16(params); in SMBOldQFSInfo()
4464 pSMB->ParameterCount = pSMB->TotalParameterCount; in SMBOldQFSInfo()
4465 pSMB->ParameterOffset = cpu_to_le16(offsetof( in SMBOldQFSInfo()
4466 struct smb_com_transaction2_qfsi_req, InformationLevel) - 4); in SMBOldQFSInfo()
4467 pSMB->DataCount = 0; in SMBOldQFSInfo()
4468 pSMB->DataOffset = 0; in SMBOldQFSInfo()
4469 pSMB->SetupCount = 1; in SMBOldQFSInfo()
4470 pSMB->Reserved3 = 0; in SMBOldQFSInfo()
4471 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in SMBOldQFSInfo()
4472 pSMB->InformationLevel = cpu_to_le16(SMB_INFO_ALLOCATION); in SMBOldQFSInfo()
4474 pSMB->ByteCount = cpu_to_le16(byte_count); in SMBOldQFSInfo()
4476 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in SMBOldQFSInfo()
4483 if (rc || get_bcc(&pSMBr->hdr) < 18) in SMBOldQFSInfo()
4484 rc = -EIO; /* bad smb */ in SMBOldQFSInfo()
4486 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in SMBOldQFSInfo()
4488 get_bcc(&pSMBr->hdr), data_offset); in SMBOldQFSInfo()
4491 (((char *) &pSMBr->hdr.Protocol) + data_offset); in SMBOldQFSInfo()
4492 FSData->f_bsize = in SMBOldQFSInfo()
4493 le16_to_cpu(response_data->BytesPerSector) * in SMBOldQFSInfo()
4494 le32_to_cpu(response_data-> in SMBOldQFSInfo()
4500 if (FSData->f_bsize < 512) in SMBOldQFSInfo()
4501 FSData->f_bsize = 4096; in SMBOldQFSInfo()
4503 FSData->f_blocks = in SMBOldQFSInfo()
4504 le32_to_cpu(response_data->TotalAllocationUnits); in SMBOldQFSInfo()
4505 FSData->f_bfree = FSData->f_bavail = in SMBOldQFSInfo()
4506 le32_to_cpu(response_data->FreeAllocationUnits); in SMBOldQFSInfo()
4508 (unsigned long long)FSData->f_blocks, in SMBOldQFSInfo()
4509 (unsigned long long)FSData->f_bfree, in SMBOldQFSInfo()
4510 FSData->f_bsize); in SMBOldQFSInfo()
4515 if (rc == -EAGAIN) in SMBOldQFSInfo()
4541 pSMB->TotalDataCount = 0; in CIFSSMBQFSInfo()
4542 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSInfo()
4543 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBQFSInfo()
4544 pSMB->MaxSetupCount = 0; in CIFSSMBQFSInfo()
4545 pSMB->Reserved = 0; in CIFSSMBQFSInfo()
4546 pSMB->Flags = 0; in CIFSSMBQFSInfo()
4547 pSMB->Timeout = 0; in CIFSSMBQFSInfo()
4548 pSMB->Reserved2 = 0; in CIFSSMBQFSInfo()
4550 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQFSInfo()
4551 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQFSInfo()
4552 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQFSInfo()
4553 struct smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSInfo()
4554 pSMB->DataCount = 0; in CIFSSMBQFSInfo()
4555 pSMB->DataOffset = 0; in CIFSSMBQFSInfo()
4556 pSMB->SetupCount = 1; in CIFSSMBQFSInfo()
4557 pSMB->Reserved3 = 0; in CIFSSMBQFSInfo()
4558 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSInfo()
4559 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FS_SIZE_INFO); in CIFSSMBQFSInfo()
4561 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSInfo()
4563 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSInfo()
4570 if (rc || get_bcc(&pSMBr->hdr) < 24) in CIFSSMBQFSInfo()
4571 rc = -EIO; /* bad smb */ in CIFSSMBQFSInfo()
4573 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSInfo()
4577 *) (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSInfo()
4579 FSData->f_bsize = in CIFSSMBQFSInfo()
4580 le32_to_cpu(response_data->BytesPerSector) * in CIFSSMBQFSInfo()
4581 le32_to_cpu(response_data-> in CIFSSMBQFSInfo()
4587 if (FSData->f_bsize < 512) in CIFSSMBQFSInfo()
4588 FSData->f_bsize = 4096; in CIFSSMBQFSInfo()
4590 FSData->f_blocks = in CIFSSMBQFSInfo()
4591 le64_to_cpu(response_data->TotalAllocationUnits); in CIFSSMBQFSInfo()
4592 FSData->f_bfree = FSData->f_bavail = in CIFSSMBQFSInfo()
4593 le64_to_cpu(response_data->FreeAllocationUnits); in CIFSSMBQFSInfo()
4595 (unsigned long long)FSData->f_blocks, in CIFSSMBQFSInfo()
4596 (unsigned long long)FSData->f_bfree, in CIFSSMBQFSInfo()
4597 FSData->f_bsize); in CIFSSMBQFSInfo()
4602 if (rc == -EAGAIN) in CIFSSMBQFSInfo()
4627 pSMB->TotalDataCount = 0; in CIFSSMBQFSAttributeInfo()
4628 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSAttributeInfo()
4630 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBQFSAttributeInfo()
4631 pSMB->MaxSetupCount = 0; in CIFSSMBQFSAttributeInfo()
4632 pSMB->Reserved = 0; in CIFSSMBQFSAttributeInfo()
4633 pSMB->Flags = 0; in CIFSSMBQFSAttributeInfo()
4634 pSMB->Timeout = 0; in CIFSSMBQFSAttributeInfo()
4635 pSMB->Reserved2 = 0; in CIFSSMBQFSAttributeInfo()
4637 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQFSAttributeInfo()
4638 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQFSAttributeInfo()
4639 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQFSAttributeInfo()
4640 struct smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSAttributeInfo()
4641 pSMB->DataCount = 0; in CIFSSMBQFSAttributeInfo()
4642 pSMB->DataOffset = 0; in CIFSSMBQFSAttributeInfo()
4643 pSMB->SetupCount = 1; in CIFSSMBQFSAttributeInfo()
4644 pSMB->Reserved3 = 0; in CIFSSMBQFSAttributeInfo()
4645 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSAttributeInfo()
4646 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FS_ATTRIBUTE_INFO); in CIFSSMBQFSAttributeInfo()
4648 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSAttributeInfo()
4650 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSAttributeInfo()
4657 if (rc || get_bcc(&pSMBr->hdr) < 13) { in CIFSSMBQFSAttributeInfo()
4659 rc = -EIO; /* bad smb */ in CIFSSMBQFSAttributeInfo()
4661 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSAttributeInfo()
4664 *) (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSAttributeInfo()
4666 memcpy(&tcon->fsAttrInfo, response_data, in CIFSSMBQFSAttributeInfo()
4672 if (rc == -EAGAIN) in CIFSSMBQFSAttributeInfo()
4697 pSMB->TotalDataCount = 0; in CIFSSMBQFSDeviceInfo()
4698 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSDeviceInfo()
4700 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBQFSDeviceInfo()
4701 pSMB->MaxSetupCount = 0; in CIFSSMBQFSDeviceInfo()
4702 pSMB->Reserved = 0; in CIFSSMBQFSDeviceInfo()
4703 pSMB->Flags = 0; in CIFSSMBQFSDeviceInfo()
4704 pSMB->Timeout = 0; in CIFSSMBQFSDeviceInfo()
4705 pSMB->Reserved2 = 0; in CIFSSMBQFSDeviceInfo()
4707 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQFSDeviceInfo()
4708 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQFSDeviceInfo()
4709 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQFSDeviceInfo()
4710 struct smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSDeviceInfo()
4712 pSMB->DataCount = 0; in CIFSSMBQFSDeviceInfo()
4713 pSMB->DataOffset = 0; in CIFSSMBQFSDeviceInfo()
4714 pSMB->SetupCount = 1; in CIFSSMBQFSDeviceInfo()
4715 pSMB->Reserved3 = 0; in CIFSSMBQFSDeviceInfo()
4716 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSDeviceInfo()
4717 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FS_DEVICE_INFO); in CIFSSMBQFSDeviceInfo()
4719 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSDeviceInfo()
4721 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSDeviceInfo()
4728 if (rc || get_bcc(&pSMBr->hdr) < in CIFSSMBQFSDeviceInfo()
4730 rc = -EIO; /* bad smb */ in CIFSSMBQFSDeviceInfo()
4732 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSDeviceInfo()
4735 (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSDeviceInfo()
4737 memcpy(&tcon->fsDevInfo, response_data, in CIFSSMBQFSDeviceInfo()
4743 if (rc == -EAGAIN) in CIFSSMBQFSDeviceInfo()
4768 pSMB->TotalDataCount = 0; in CIFSSMBQFSUnixInfo()
4769 pSMB->DataCount = 0; in CIFSSMBQFSUnixInfo()
4770 pSMB->DataOffset = 0; in CIFSSMBQFSUnixInfo()
4771 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSUnixInfo()
4773 pSMB->MaxDataCount = cpu_to_le16(100); in CIFSSMBQFSUnixInfo()
4774 pSMB->MaxSetupCount = 0; in CIFSSMBQFSUnixInfo()
4775 pSMB->Reserved = 0; in CIFSSMBQFSUnixInfo()
4776 pSMB->Flags = 0; in CIFSSMBQFSUnixInfo()
4777 pSMB->Timeout = 0; in CIFSSMBQFSUnixInfo()
4778 pSMB->Reserved2 = 0; in CIFSSMBQFSUnixInfo()
4780 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBQFSUnixInfo()
4781 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBQFSUnixInfo()
4782 pSMB->ParameterOffset = cpu_to_le16(offsetof(struct in CIFSSMBQFSUnixInfo()
4783 smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSUnixInfo()
4784 pSMB->SetupCount = 1; in CIFSSMBQFSUnixInfo()
4785 pSMB->Reserved3 = 0; in CIFSSMBQFSUnixInfo()
4786 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSUnixInfo()
4787 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_CIFS_UNIX_INFO); in CIFSSMBQFSUnixInfo()
4789 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSUnixInfo()
4791 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSUnixInfo()
4798 if (rc || get_bcc(&pSMBr->hdr) < 13) { in CIFSSMBQFSUnixInfo()
4799 rc = -EIO; /* bad smb */ in CIFSSMBQFSUnixInfo()
4801 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSUnixInfo()
4804 *) (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSUnixInfo()
4806 memcpy(&tcon->fsUnixInfo, response_data, in CIFSSMBQFSUnixInfo()
4812 if (rc == -EAGAIN) in CIFSSMBQFSUnixInfo()
4838 pSMB->MaxSetupCount = 0; in CIFSSMBSetFSUnixInfo()
4839 pSMB->Reserved = 0; in CIFSSMBSetFSUnixInfo()
4840 pSMB->Flags = 0; in CIFSSMBSetFSUnixInfo()
4841 pSMB->Timeout = 0; in CIFSSMBSetFSUnixInfo()
4842 pSMB->Reserved2 = 0; in CIFSSMBSetFSUnixInfo()
4844 - 4; in CIFSSMBSetFSUnixInfo()
4847 pSMB->MaxParameterCount = cpu_to_le16(4); in CIFSSMBSetFSUnixInfo()
4849 pSMB->MaxDataCount = cpu_to_le16(100); in CIFSSMBSetFSUnixInfo()
4850 pSMB->SetupCount = 1; in CIFSSMBSetFSUnixInfo()
4851 pSMB->Reserved3 = 0; in CIFSSMBSetFSUnixInfo()
4852 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FS_INFORMATION); in CIFSSMBSetFSUnixInfo()
4855 pSMB->DataCount = cpu_to_le16(12); in CIFSSMBSetFSUnixInfo()
4856 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetFSUnixInfo()
4857 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetFSUnixInfo()
4858 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetFSUnixInfo()
4859 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetFSUnixInfo()
4860 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetFSUnixInfo()
4863 pSMB->FileNum = 0; in CIFSSMBSetFSUnixInfo()
4864 pSMB->InformationLevel = cpu_to_le16(SMB_SET_CIFS_UNIX_INFO); in CIFSSMBSetFSUnixInfo()
4867 pSMB->ClientUnixMajor = cpu_to_le16(CIFS_UNIX_MAJOR_VERSION); in CIFSSMBSetFSUnixInfo()
4868 pSMB->ClientUnixMinor = cpu_to_le16(CIFS_UNIX_MINOR_VERSION); in CIFSSMBSetFSUnixInfo()
4869 pSMB->ClientUnixCap = cpu_to_le64(cap); in CIFSSMBSetFSUnixInfo()
4872 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetFSUnixInfo()
4874 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetFSUnixInfo()
4881 rc = -EIO; /* bad smb */ in CIFSSMBSetFSUnixInfo()
4885 if (rc == -EAGAIN) in CIFSSMBSetFSUnixInfo()
4913 pSMB->TotalDataCount = 0; in CIFSSMBQFSPosixInfo()
4914 pSMB->DataCount = 0; in CIFSSMBQFSPosixInfo()
4915 pSMB->DataOffset = 0; in CIFSSMBQFSPosixInfo()
4916 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSPosixInfo()
4918 pSMB->MaxDataCount = cpu_to_le16(100); in CIFSSMBQFSPosixInfo()
4919 pSMB->MaxSetupCount = 0; in CIFSSMBQFSPosixInfo()
4920 pSMB->Reserved = 0; in CIFSSMBQFSPosixInfo()
4921 pSMB->Flags = 0; in CIFSSMBQFSPosixInfo()
4922 pSMB->Timeout = 0; in CIFSSMBQFSPosixInfo()
4923 pSMB->Reserved2 = 0; in CIFSSMBQFSPosixInfo()
4925 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBQFSPosixInfo()
4926 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBQFSPosixInfo()
4927 pSMB->ParameterOffset = cpu_to_le16(offsetof(struct in CIFSSMBQFSPosixInfo()
4928 smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSPosixInfo()
4929 pSMB->SetupCount = 1; in CIFSSMBQFSPosixInfo()
4930 pSMB->Reserved3 = 0; in CIFSSMBQFSPosixInfo()
4931 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSPosixInfo()
4932 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_POSIX_FS_INFO); in CIFSSMBQFSPosixInfo()
4934 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSPosixInfo()
4936 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSPosixInfo()
4943 if (rc || get_bcc(&pSMBr->hdr) < 13) { in CIFSSMBQFSPosixInfo()
4944 rc = -EIO; /* bad smb */ in CIFSSMBQFSPosixInfo()
4946 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSPosixInfo()
4949 *) (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSPosixInfo()
4951 FSData->f_bsize = in CIFSSMBQFSPosixInfo()
4952 le32_to_cpu(response_data->BlockSize); in CIFSSMBQFSPosixInfo()
4957 if (FSData->f_bsize < 512) in CIFSSMBQFSPosixInfo()
4958 FSData->f_bsize = 4096; in CIFSSMBQFSPosixInfo()
4960 FSData->f_blocks = in CIFSSMBQFSPosixInfo()
4961 le64_to_cpu(response_data->TotalBlocks); in CIFSSMBQFSPosixInfo()
4962 FSData->f_bfree = in CIFSSMBQFSPosixInfo()
4963 le64_to_cpu(response_data->BlocksAvail); in CIFSSMBQFSPosixInfo()
4964 if (response_data->UserBlocksAvail == cpu_to_le64(-1)) { in CIFSSMBQFSPosixInfo()
4965 FSData->f_bavail = FSData->f_bfree; in CIFSSMBQFSPosixInfo()
4967 FSData->f_bavail = in CIFSSMBQFSPosixInfo()
4968 le64_to_cpu(response_data->UserBlocksAvail); in CIFSSMBQFSPosixInfo()
4970 if (response_data->TotalFileNodes != cpu_to_le64(-1)) in CIFSSMBQFSPosixInfo()
4971 FSData->f_files = in CIFSSMBQFSPosixInfo()
4972 le64_to_cpu(response_data->TotalFileNodes); in CIFSSMBQFSPosixInfo()
4973 if (response_data->FreeFileNodes != cpu_to_le64(-1)) in CIFSSMBQFSPosixInfo()
4974 FSData->f_ffree = in CIFSSMBQFSPosixInfo()
4975 le64_to_cpu(response_data->FreeFileNodes); in CIFSSMBQFSPosixInfo()
4980 if (rc == -EAGAIN) in CIFSSMBQFSPosixInfo()
4988 * We can not use write of zero bytes trick to set file size due to need for
5015 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBSetEOF()
5017 cifsConvertToUTF16((__le16 *) pSMB->FileName, file_name, in CIFSSMBSetEOF()
5018 PATH_MAX, cifs_sb->local_nls, remap); in CIFSSMBSetEOF()
5022 name_len = copy_path_name(pSMB->FileName, file_name); in CIFSSMBSetEOF()
5026 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetEOF()
5027 pSMB->MaxDataCount = cpu_to_le16(4100); in CIFSSMBSetEOF()
5028 pSMB->MaxSetupCount = 0; in CIFSSMBSetEOF()
5029 pSMB->Reserved = 0; in CIFSSMBSetEOF()
5030 pSMB->Flags = 0; in CIFSSMBSetEOF()
5031 pSMB->Timeout = 0; in CIFSSMBSetEOF()
5032 pSMB->Reserved2 = 0; in CIFSSMBSetEOF()
5034 InformationLevel) - 4; in CIFSSMBSetEOF()
5037 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetEOF()
5038 pSMB->InformationLevel = in CIFSSMBSetEOF()
5041 pSMB->InformationLevel = in CIFSSMBSetEOF()
5043 } else /* Set File Size */ { in CIFSSMBSetEOF()
5044 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetEOF()
5045 pSMB->InformationLevel = in CIFSSMBSetEOF()
5048 pSMB->InformationLevel = in CIFSSMBSetEOF()
5053 (struct file_end_of_file_info *) (((char *) &pSMB->hdr.Protocol) + in CIFSSMBSetEOF()
5055 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetEOF()
5056 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetEOF()
5057 pSMB->SetupCount = 1; in CIFSSMBSetEOF()
5058 pSMB->Reserved3 = 0; in CIFSSMBSetEOF()
5059 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSSMBSetEOF()
5061 pSMB->DataCount = cpu_to_le16(data_count); in CIFSSMBSetEOF()
5062 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetEOF()
5063 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetEOF()
5064 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetEOF()
5065 pSMB->Reserved4 = 0; in CIFSSMBSetEOF()
5067 parm_data->FileSize = cpu_to_le64(size); in CIFSSMBSetEOF()
5068 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetEOF()
5069 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetEOF()
5076 if (rc == -EAGAIN) in CIFSSMBSetEOF()
5098 pSMB->hdr.Pid = cpu_to_le16((__u16)cfile->pid); in CIFSSMBSetFileSize()
5099 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(cfile->pid >> 16)); in CIFSSMBSetFileSize()
5102 pSMB->MaxSetupCount = 0; in CIFSSMBSetFileSize()
5103 pSMB->Reserved = 0; in CIFSSMBSetFileSize()
5104 pSMB->Flags = 0; in CIFSSMBSetFileSize()
5105 pSMB->Timeout = 0; in CIFSSMBSetFileSize()
5106 pSMB->Reserved2 = 0; in CIFSSMBSetFileSize()
5107 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBSetFileSize()
5111 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetFileSize()
5113 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetFileSize()
5114 pSMB->SetupCount = 1; in CIFSSMBSetFileSize()
5115 pSMB->Reserved3 = 0; in CIFSSMBSetFileSize()
5116 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBSetFileSize()
5118 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetFileSize()
5119 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetFileSize()
5120 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetFileSize()
5121 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetFileSize()
5122 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetFileSize()
5126 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetFileSize()
5127 parm_data->FileSize = cpu_to_le64(size); in CIFSSMBSetFileSize()
5128 pSMB->Fid = cfile->fid.netfid; in CIFSSMBSetFileSize()
5130 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetFileSize()
5131 pSMB->InformationLevel = in CIFSSMBSetFileSize()
5134 pSMB->InformationLevel = in CIFSSMBSetFileSize()
5136 } else /* Set File Size */ { in CIFSSMBSetFileSize()
5137 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetFileSize()
5138 pSMB->InformationLevel = in CIFSSMBSetFileSize()
5141 pSMB->InformationLevel = in CIFSSMBSetFileSize()
5144 pSMB->Reserved4 = 0; in CIFSSMBSetFileSize()
5146 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetFileSize()
5147 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBSetFileSize()
5154 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBSetFileSize()
5160 /* Some legacy servers such as NT4 require that the file times be set on
5161 an open handle, rather than by pathname - this is awkward due to
5175 cifs_dbg(FYI, "Set Times (via SetFileInfo)\n"); in CIFSSMBSetFileInfo()
5181 pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener); in CIFSSMBSetFileInfo()
5182 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16)); in CIFSSMBSetFileInfo()
5185 pSMB->MaxSetupCount = 0; in CIFSSMBSetFileInfo()
5186 pSMB->Reserved = 0; in CIFSSMBSetFileInfo()
5187 pSMB->Flags = 0; in CIFSSMBSetFileInfo()
5188 pSMB->Timeout = 0; in CIFSSMBSetFileInfo()
5189 pSMB->Reserved2 = 0; in CIFSSMBSetFileInfo()
5190 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBSetFileInfo()
5197 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetFileInfo()
5199 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetFileInfo()
5200 pSMB->SetupCount = 1; in CIFSSMBSetFileInfo()
5201 pSMB->Reserved3 = 0; in CIFSSMBSetFileInfo()
5202 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBSetFileInfo()
5204 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetFileInfo()
5205 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetFileInfo()
5206 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetFileInfo()
5207 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetFileInfo()
5208 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetFileInfo()
5209 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetFileInfo()
5210 pSMB->Fid = fid; in CIFSSMBSetFileInfo()
5211 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetFileInfo()
5212 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_BASIC_INFO2); in CIFSSMBSetFileInfo()
5214 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_BASIC_INFO); in CIFSSMBSetFileInfo()
5215 pSMB->Reserved4 = 0; in CIFSSMBSetFileInfo()
5217 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetFileInfo()
5219 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBSetFileInfo()
5222 cifs_dbg(FYI, "Send error in Set Time (SetFileInfo) = %d\n", in CIFSSMBSetFileInfo()
5225 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBSetFileInfo()
5240 cifs_dbg(FYI, "Set File Disposition (via SetFileInfo)\n"); in CIFSSMBSetFileDisposition()
5246 pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener); in CIFSSMBSetFileDisposition()
5247 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16)); in CIFSSMBSetFileDisposition()
5250 pSMB->MaxSetupCount = 0; in CIFSSMBSetFileDisposition()
5251 pSMB->Reserved = 0; in CIFSSMBSetFileDisposition()
5252 pSMB->Flags = 0; in CIFSSMBSetFileDisposition()
5253 pSMB->Timeout = 0; in CIFSSMBSetFileDisposition()
5254 pSMB->Reserved2 = 0; in CIFSSMBSetFileDisposition()
5255 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBSetFileDisposition()
5262 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetFileDisposition()
5264 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetFileDisposition()
5265 pSMB->SetupCount = 1; in CIFSSMBSetFileDisposition()
5266 pSMB->Reserved3 = 0; in CIFSSMBSetFileDisposition()
5267 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBSetFileDisposition()
5269 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetFileDisposition()
5270 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetFileDisposition()
5271 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetFileDisposition()
5272 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetFileDisposition()
5273 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetFileDisposition()
5274 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetFileDisposition()
5275 pSMB->Fid = fid; in CIFSSMBSetFileDisposition()
5276 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_DISPOSITION_INFO); in CIFSSMBSetFileDisposition()
5277 pSMB->Reserved4 = 0; in CIFSSMBSetFileDisposition()
5279 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetFileDisposition()
5281 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBSetFileDisposition()
5314 rc = CIFSSMBSetFileInfo(xid, tcon, data, fid.netfid, current->tgid); in CIFSSMBSetPathInfoFB()
5344 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBSetPathInfo()
5346 cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, in CIFSSMBSetPathInfo()
5351 name_len = copy_path_name(pSMB->FileName, fileName); in CIFSSMBSetPathInfo()
5356 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetPathInfo()
5358 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetPathInfo()
5359 pSMB->MaxSetupCount = 0; in CIFSSMBSetPathInfo()
5360 pSMB->Reserved = 0; in CIFSSMBSetPathInfo()
5361 pSMB->Flags = 0; in CIFSSMBSetPathInfo()
5362 pSMB->Timeout = 0; in CIFSSMBSetPathInfo()
5363 pSMB->Reserved2 = 0; in CIFSSMBSetPathInfo()
5365 InformationLevel) - 4; in CIFSSMBSetPathInfo()
5368 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetPathInfo()
5369 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetPathInfo()
5370 pSMB->SetupCount = 1; in CIFSSMBSetPathInfo()
5371 pSMB->Reserved3 = 0; in CIFSSMBSetPathInfo()
5372 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSSMBSetPathInfo()
5375 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetPathInfo()
5376 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetPathInfo()
5377 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetPathInfo()
5378 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetPathInfo()
5379 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetPathInfo()
5380 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_BASIC_INFO2); in CIFSSMBSetPathInfo()
5382 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_BASIC_INFO); in CIFSSMBSetPathInfo()
5383 pSMB->Reserved4 = 0; in CIFSSMBSetPathInfo()
5386 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetPathInfo()
5387 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetPathInfo()
5394 if (rc == -EAGAIN) in CIFSSMBSetPathInfo()
5397 if (rc == -EOPNOTSUPP) in CIFSSMBSetPathInfo()
5409 u64 mode = args->mode; in cifs_fill_unix_set_info()
5411 if (uid_valid(args->uid)) in cifs_fill_unix_set_info()
5412 uid = from_kuid(&init_user_ns, args->uid); in cifs_fill_unix_set_info()
5413 if (gid_valid(args->gid)) in cifs_fill_unix_set_info()
5414 gid = from_kgid(&init_user_ns, args->gid); in cifs_fill_unix_set_info()
5417 * Samba server ignores set of file size to zero due to bugs in some in cifs_fill_unix_set_info()
5418 * older clients, but we should be precise - we use SetFileSize to in cifs_fill_unix_set_info()
5419 * set file size and do not want to truncate file size to zero in cifs_fill_unix_set_info()
5421 * zero instead of -1 here in cifs_fill_unix_set_info()
5423 data_offset->EndOfFile = cpu_to_le64(NO_CHANGE_64); in cifs_fill_unix_set_info()
5424 data_offset->NumOfBytes = cpu_to_le64(NO_CHANGE_64); in cifs_fill_unix_set_info()
5425 data_offset->LastStatusChange = cpu_to_le64(args->ctime); in cifs_fill_unix_set_info()
5426 data_offset->LastAccessTime = cpu_to_le64(args->atime); in cifs_fill_unix_set_info()
5427 data_offset->LastModificationTime = cpu_to_le64(args->mtime); in cifs_fill_unix_set_info()
5428 data_offset->Uid = cpu_to_le64(uid); in cifs_fill_unix_set_info()
5429 data_offset->Gid = cpu_to_le64(gid); in cifs_fill_unix_set_info()
5431 data_offset->DevMajor = cpu_to_le64(MAJOR(args->device)); in cifs_fill_unix_set_info()
5432 data_offset->DevMinor = cpu_to_le64(MINOR(args->device)); in cifs_fill_unix_set_info()
5433 data_offset->Permissions = cpu_to_le64(mode); in cifs_fill_unix_set_info()
5436 data_offset->Type = cpu_to_le32(UNIX_FILE); in cifs_fill_unix_set_info()
5438 data_offset->Type = cpu_to_le32(UNIX_DIR); in cifs_fill_unix_set_info()
5440 data_offset->Type = cpu_to_le32(UNIX_SYMLINK); in cifs_fill_unix_set_info()
5442 data_offset->Type = cpu_to_le32(UNIX_CHARDEV); in cifs_fill_unix_set_info()
5444 data_offset->Type = cpu_to_le32(UNIX_BLOCKDEV); in cifs_fill_unix_set_info()
5446 data_offset->Type = cpu_to_le32(UNIX_FIFO); in cifs_fill_unix_set_info()
5448 data_offset->Type = cpu_to_le32(UNIX_SOCKET); in cifs_fill_unix_set_info()
5461 cifs_dbg(FYI, "Set Unix Info (via SetFileInfo)\n"); in CIFSSMBUnixSetFileInfo()
5467 pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener); in CIFSSMBUnixSetFileInfo()
5468 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16)); in CIFSSMBUnixSetFileInfo()
5471 pSMB->MaxSetupCount = 0; in CIFSSMBUnixSetFileInfo()
5472 pSMB->Reserved = 0; in CIFSSMBUnixSetFileInfo()
5473 pSMB->Flags = 0; in CIFSSMBUnixSetFileInfo()
5474 pSMB->Timeout = 0; in CIFSSMBUnixSetFileInfo()
5475 pSMB->Reserved2 = 0; in CIFSSMBUnixSetFileInfo()
5476 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBUnixSetFileInfo()
5484 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBUnixSetFileInfo()
5486 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBUnixSetFileInfo()
5487 pSMB->SetupCount = 1; in CIFSSMBUnixSetFileInfo()
5488 pSMB->Reserved3 = 0; in CIFSSMBUnixSetFileInfo()
5489 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBUnixSetFileInfo()
5491 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBUnixSetFileInfo()
5492 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBUnixSetFileInfo()
5493 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBUnixSetFileInfo()
5494 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBUnixSetFileInfo()
5495 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBUnixSetFileInfo()
5496 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBUnixSetFileInfo()
5497 pSMB->Fid = fid; in CIFSSMBUnixSetFileInfo()
5498 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_UNIX_BASIC); in CIFSSMBUnixSetFileInfo()
5499 pSMB->Reserved4 = 0; in CIFSSMBUnixSetFileInfo()
5501 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixSetFileInfo()
5505 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBUnixSetFileInfo()
5508 cifs_dbg(FYI, "Send error in Set Time (SetFileInfo) = %d\n", in CIFSSMBUnixSetFileInfo()
5511 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBUnixSetFileInfo()
5538 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBUnixSetPathInfo()
5540 cifsConvertToUTF16((__le16 *) pSMB->FileName, file_name, in CIFSSMBUnixSetPathInfo()
5545 name_len = copy_path_name(pSMB->FileName, file_name); in CIFSSMBUnixSetPathInfo()
5550 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBUnixSetPathInfo()
5552 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBUnixSetPathInfo()
5553 pSMB->MaxSetupCount = 0; in CIFSSMBUnixSetPathInfo()
5554 pSMB->Reserved = 0; in CIFSSMBUnixSetPathInfo()
5555 pSMB->Flags = 0; in CIFSSMBUnixSetPathInfo()
5556 pSMB->Timeout = 0; in CIFSSMBUnixSetPathInfo()
5557 pSMB->Reserved2 = 0; in CIFSSMBUnixSetPathInfo()
5559 InformationLevel) - 4; in CIFSSMBUnixSetPathInfo()
5564 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBUnixSetPathInfo()
5565 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBUnixSetPathInfo()
5566 pSMB->SetupCount = 1; in CIFSSMBUnixSetPathInfo()
5567 pSMB->Reserved3 = 0; in CIFSSMBUnixSetPathInfo()
5568 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSSMBUnixSetPathInfo()
5570 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBUnixSetPathInfo()
5571 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBUnixSetPathInfo()
5572 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBUnixSetPathInfo()
5573 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBUnixSetPathInfo()
5574 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_UNIX_BASIC); in CIFSSMBUnixSetPathInfo()
5575 pSMB->Reserved4 = 0; in CIFSSMBUnixSetPathInfo()
5580 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixSetPathInfo()
5581 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBUnixSetPathInfo()
5587 if (rc == -EAGAIN) in CIFSSMBUnixSetPathInfo()
5594 * Do a path-based QUERY_ALL_EAS call and parse the result. This is a common
5595 * function used by listxattr and getxattr type calls. When ea_name is set,
5612 struct nls_table *nls_codepage = cifs_sb->local_nls; in CIFSSMBQAllEAs()
5630 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBQAllEAs()
5632 cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, in CIFSSMBQAllEAs()
5637 list_len = copy_path_name(pSMB->FileName, searchName); in CIFSSMBQAllEAs()
5641 pSMB->TotalDataCount = 0; in CIFSSMBQAllEAs()
5642 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQAllEAs()
5644 pSMB->MaxDataCount = cpu_to_le16(CIFSMaxBufSize); in CIFSSMBQAllEAs()
5645 pSMB->MaxSetupCount = 0; in CIFSSMBQAllEAs()
5646 pSMB->Reserved = 0; in CIFSSMBQAllEAs()
5647 pSMB->Flags = 0; in CIFSSMBQAllEAs()
5648 pSMB->Timeout = 0; in CIFSSMBQAllEAs()
5649 pSMB->Reserved2 = 0; in CIFSSMBQAllEAs()
5650 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQAllEAs()
5651 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSSMBQAllEAs()
5652 pSMB->DataCount = 0; in CIFSSMBQAllEAs()
5653 pSMB->DataOffset = 0; in CIFSSMBQAllEAs()
5654 pSMB->SetupCount = 1; in CIFSSMBQAllEAs()
5655 pSMB->Reserved3 = 0; in CIFSSMBQAllEAs()
5656 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSSMBQAllEAs()
5658 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQAllEAs()
5659 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQAllEAs()
5660 pSMB->InformationLevel = cpu_to_le16(SMB_INFO_QUERY_ALL_EAS); in CIFSSMBQAllEAs()
5661 pSMB->Reserved4 = 0; in CIFSSMBQAllEAs()
5663 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQAllEAs()
5665 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQAllEAs()
5678 if (rc || get_bcc(&pSMBr->hdr) < 4) { in CIFSSMBQAllEAs()
5679 rc = -EIO; /* bad smb */ in CIFSSMBQAllEAs()
5691 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQAllEAs()
5693 (((char *) &pSMBr->hdr.Protocol) + data_offset); in CIFSSMBQAllEAs()
5695 list_len = le32_to_cpu(ea_response_data->list_len); in CIFSSMBQAllEAs()
5701 rc = -ENODATA; in CIFSSMBQAllEAs()
5706 end_of_smb = (char *)pByteArea(&pSMBr->hdr) + get_bcc(&pSMBr->hdr); in CIFSSMBQAllEAs()
5709 rc = -EIO; in CIFSSMBQAllEAs()
5714 list_len -= 4; in CIFSSMBQAllEAs()
5715 temp_fea = &ea_response_data->list; in CIFSSMBQAllEAs()
5721 list_len -= 4; in CIFSSMBQAllEAs()
5726 rc = -EIO; in CIFSSMBQAllEAs()
5730 name_len = temp_fea->name_len; in CIFSSMBQAllEAs()
5731 value_len = le16_to_cpu(temp_fea->value_len); in CIFSSMBQAllEAs()
5732 list_len -= name_len + 1 + value_len; in CIFSSMBQAllEAs()
5735 rc = -EIO; in CIFSSMBQAllEAs()
5747 rc = -ERANGE; in CIFSSMBQAllEAs()
5765 /* skip copy - calc size only */ in CIFSSMBQAllEAs()
5768 rc = -ERANGE; in CIFSSMBQAllEAs()
5778 rc = -ENODATA; in CIFSSMBQAllEAs()
5782 if (rc == -EAGAIN) in CIFSSMBQAllEAs()
5810 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBSetEA()
5812 cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, in CIFSSMBSetEA()
5817 name_len = copy_path_name(pSMB->FileName, fileName); in CIFSSMBSetEA()
5831 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetEA()
5833 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetEA()
5834 pSMB->MaxSetupCount = 0; in CIFSSMBSetEA()
5835 pSMB->Reserved = 0; in CIFSSMBSetEA()
5836 pSMB->Flags = 0; in CIFSSMBSetEA()
5837 pSMB->Timeout = 0; in CIFSSMBSetEA()
5838 pSMB->Reserved2 = 0; in CIFSSMBSetEA()
5840 InformationLevel) - 4; in CIFSSMBSetEA()
5842 pSMB->InformationLevel = in CIFSSMBSetEA()
5846 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetEA()
5847 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetEA()
5848 pSMB->SetupCount = 1; in CIFSSMBSetEA()
5849 pSMB->Reserved3 = 0; in CIFSSMBSetEA()
5850 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSSMBSetEA()
5852 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetEA()
5853 parm_data->list_len = cpu_to_le32(count); in CIFSSMBSetEA()
5854 parm_data->list.EA_flags = 0; in CIFSSMBSetEA()
5856 parm_data->list.name_len = (__u8)name_len; in CIFSSMBSetEA()
5859 strncpy(parm_data->list.name, ea_name, name_len); in CIFSSMBSetEA()
5860 parm_data->list.name[name_len] = '\0'; in CIFSSMBSetEA()
5861 parm_data->list.value_len = cpu_to_le16(ea_value_len); in CIFSSMBSetEA()
5867 /* if (ea_value_len > buffer_size - 512 (enough for header)) */ in CIFSSMBSetEA()
5869 memcpy(parm_data->list.name + name_len + 1, in CIFSSMBSetEA()
5872 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetEA()
5873 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetEA()
5874 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetEA()
5875 pSMB->Reserved4 = 0; in CIFSSMBSetEA()
5877 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetEA()
5878 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetEA()
5885 if (rc == -EAGAIN) in CIFSSMBSetEA()