• 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->session_key_id = pSMBr->SessionKey; in CIFSSMBNegotiate()
483 server->timeAdj = (int)(__s16)le16_to_cpu(pSMBr->ServerTimeZone); in CIFSSMBNegotiate()
484 server->timeAdj *= 60; in CIFSSMBNegotiate()
486 if (pSMBr->EncryptionKeyLength == CIFS_CRYPTO_KEY_SIZE) { in CIFSSMBNegotiate()
487 server->negflavor = CIFS_NEGFLAVOR_UNENCAP; in CIFSSMBNegotiate()
488 memcpy(ses->server->cryptkey, pSMBr->u.EncryptionKey, in CIFSSMBNegotiate()
490 } else if (pSMBr->hdr.Flags2 & SMBFLG2_EXT_SEC || in CIFSSMBNegotiate()
491 server->capabilities & CAP_EXTENDED_SECURITY) { in CIFSSMBNegotiate()
492 server->negflavor = CIFS_NEGFLAVOR_EXTENDED; in CIFSSMBNegotiate()
494 } else if (server->sec_mode & SECMODE_PW_ENCRYPT) { in CIFSSMBNegotiate()
495 rc = -EIO; /* no crypt key only if plain text pwd */ in CIFSSMBNegotiate()
497 server->negflavor = CIFS_NEGFLAVOR_UNENCAP; in CIFSSMBNegotiate()
498 server->capabilities &= ~CAP_EXTENDED_SECURITY; in CIFSSMBNegotiate()
502 rc = cifs_enable_signing(server, ses->sign); in CIFSSMBNegotiate()
519 if ((tcon->ses == NULL) || (tcon->ses->server == NULL)) in CIFSSMBTDis()
520 return -EIO; in CIFSSMBTDis()
528 spin_lock(&tcon->ses->chan_lock); in CIFSSMBTDis()
529 if ((tcon->need_reconnect) || CIFS_ALL_CHANS_NEED_RECONNECT(tcon->ses)) { in CIFSSMBTDis()
530 spin_unlock(&tcon->ses->chan_lock); in CIFSSMBTDis()
531 return -EIO; in CIFSSMBTDis()
533 spin_unlock(&tcon->ses->chan_lock); in CIFSSMBTDis()
540 rc = SendReceiveNoRsp(xid, tcon->ses, (char *)smb_buffer, 0); in CIFSSMBTDis()
547 if (rc == -EAGAIN) in CIFSSMBTDis()
554 * This is a no-op for now. We're not really interested in the reply, but
555 * rather in the fact that the server sent one and that server->lstrp
563 struct TCP_Server_Info *server = mid->callback_data; in cifs_echo_callback()
585 if (server->capabilities & CAP_UNICODE) in CIFSSMBEcho()
586 smb->hdr.Flags2 |= SMBFLG2_UNICODE; in CIFSSMBEcho()
588 /* set up echo request */ in CIFSSMBEcho()
589 smb->hdr.Tid = 0xffff; in CIFSSMBEcho()
590 smb->hdr.WordCount = 1; in CIFSSMBEcho()
591 put_unaligned_le16(1, &smb->EchoCount); in CIFSSMBEcho()
592 put_bcc(1, &smb->hdr); in CIFSSMBEcho()
593 smb->Data[0] = 'a'; in CIFSSMBEcho()
624 if (!ses || !ses->server) in CIFSSMBLogoff()
625 return -EIO; in CIFSSMBLogoff()
627 mutex_lock(&ses->session_mutex); in CIFSSMBLogoff()
628 spin_lock(&ses->chan_lock); in CIFSSMBLogoff()
630 spin_unlock(&ses->chan_lock); in CIFSSMBLogoff()
634 spin_unlock(&ses->chan_lock); in CIFSSMBLogoff()
638 mutex_unlock(&ses->session_mutex); in CIFSSMBLogoff()
642 pSMB->hdr.Mid = get_next_mid(ses->server); in CIFSSMBLogoff()
644 if (ses->server->sign) in CIFSSMBLogoff()
645 pSMB->hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE; in CIFSSMBLogoff()
647 pSMB->hdr.Uid = ses->Suid; in CIFSSMBLogoff()
649 pSMB->AndXCommand = 0xFF; in CIFSSMBLogoff()
653 mutex_unlock(&ses->session_mutex); in CIFSSMBLogoff()
658 if (rc == -EAGAIN) in CIFSSMBLogoff()
683 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSPOSIXDelFile()
685 cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, in CIFSPOSIXDelFile()
690 name_len = copy_path_name(pSMB->FileName, fileName); in CIFSPOSIXDelFile()
694 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSPOSIXDelFile()
695 pSMB->MaxDataCount = 0; /* BB double check this with jra */ in CIFSPOSIXDelFile()
696 pSMB->MaxSetupCount = 0; in CIFSPOSIXDelFile()
697 pSMB->Reserved = 0; in CIFSPOSIXDelFile()
698 pSMB->Flags = 0; in CIFSPOSIXDelFile()
699 pSMB->Timeout = 0; in CIFSPOSIXDelFile()
700 pSMB->Reserved2 = 0; in CIFSPOSIXDelFile()
702 InformationLevel) - 4; in CIFSPOSIXDelFile()
710 pRqD->type = cpu_to_le16(type); in CIFSPOSIXDelFile()
711 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSPOSIXDelFile()
712 pSMB->DataOffset = cpu_to_le16(offset); in CIFSPOSIXDelFile()
713 pSMB->SetupCount = 1; in CIFSPOSIXDelFile()
714 pSMB->Reserved3 = 0; in CIFSPOSIXDelFile()
715 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSPOSIXDelFile()
718 pSMB->DataCount = cpu_to_le16(sizeof(struct unlink_psx_rq)); in CIFSPOSIXDelFile()
719 pSMB->TotalDataCount = cpu_to_le16(sizeof(struct unlink_psx_rq)); in CIFSPOSIXDelFile()
720 pSMB->ParameterCount = cpu_to_le16(params); in CIFSPOSIXDelFile()
721 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSPOSIXDelFile()
722 pSMB->InformationLevel = cpu_to_le16(SMB_POSIX_UNLINK); in CIFSPOSIXDelFile()
723 pSMB->Reserved4 = 0; in CIFSPOSIXDelFile()
725 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSPOSIXDelFile()
726 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSPOSIXDelFile()
732 cifs_stats_inc(&tcon->stats.cifs_stats.num_deletes); in CIFSPOSIXDelFile()
734 if (rc == -EAGAIN) in CIFSPOSIXDelFile()
757 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBDelFile()
758 name_len = cifsConvertToUTF16((__le16 *) pSMB->fileName, name, in CIFSSMBDelFile()
759 PATH_MAX, cifs_sb->local_nls, in CIFSSMBDelFile()
764 name_len = copy_path_name(pSMB->fileName, name); in CIFSSMBDelFile()
766 pSMB->SearchAttributes = in CIFSSMBDelFile()
768 pSMB->BufferFormat = 0x04; in CIFSSMBDelFile()
770 pSMB->ByteCount = cpu_to_le16(name_len + 1); in CIFSSMBDelFile()
771 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBDelFile()
773 cifs_stats_inc(&tcon->stats.cifs_stats.num_deletes); in CIFSSMBDelFile()
778 if (rc == -EAGAIN) in CIFSSMBDelFile()
802 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBRmDir()
803 name_len = cifsConvertToUTF16((__le16 *) pSMB->DirName, name, in CIFSSMBRmDir()
804 PATH_MAX, cifs_sb->local_nls, in CIFSSMBRmDir()
809 name_len = copy_path_name(pSMB->DirName, name); in CIFSSMBRmDir()
812 pSMB->BufferFormat = 0x04; in CIFSSMBRmDir()
814 pSMB->ByteCount = cpu_to_le16(name_len + 1); in CIFSSMBRmDir()
815 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBRmDir()
817 cifs_stats_inc(&tcon->stats.cifs_stats.num_rmdirs); in CIFSSMBRmDir()
822 if (rc == -EAGAIN) in CIFSSMBRmDir()
846 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBMkDir()
847 name_len = cifsConvertToUTF16((__le16 *) pSMB->DirName, name, in CIFSSMBMkDir()
848 PATH_MAX, cifs_sb->local_nls, in CIFSSMBMkDir()
853 name_len = copy_path_name(pSMB->DirName, name); in CIFSSMBMkDir()
856 pSMB->BufferFormat = 0x04; in CIFSSMBMkDir()
858 pSMB->ByteCount = cpu_to_le16(name_len + 1); in CIFSSMBMkDir()
859 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBMkDir()
861 cifs_stats_inc(&tcon->stats.cifs_stats.num_mkdirs); in CIFSSMBMkDir()
866 if (rc == -EAGAIN) in CIFSSMBMkDir()
894 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSPOSIXCreate()
896 cifsConvertToUTF16((__le16 *) pSMB->FileName, name, in CIFSPOSIXCreate()
901 name_len = copy_path_name(pSMB->FileName, name); in CIFSPOSIXCreate()
906 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSPOSIXCreate()
907 pSMB->MaxDataCount = cpu_to_le16(1000); /* large enough */ in CIFSPOSIXCreate()
908 pSMB->MaxSetupCount = 0; in CIFSPOSIXCreate()
909 pSMB->Reserved = 0; in CIFSPOSIXCreate()
910 pSMB->Flags = 0; in CIFSPOSIXCreate()
911 pSMB->Timeout = 0; in CIFSPOSIXCreate()
912 pSMB->Reserved2 = 0; in CIFSPOSIXCreate()
914 InformationLevel) - 4; in CIFSPOSIXCreate()
918 pdata->Level = cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC); in CIFSPOSIXCreate()
919 pdata->Permissions = cpu_to_le64(mode); in CIFSPOSIXCreate()
920 pdata->PosixOpenFlags = cpu_to_le32(posix_flags); in CIFSPOSIXCreate()
921 pdata->OpenFlags = cpu_to_le32(*pOplock); in CIFSPOSIXCreate()
922 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSPOSIXCreate()
923 pSMB->DataOffset = cpu_to_le16(offset); in CIFSPOSIXCreate()
924 pSMB->SetupCount = 1; in CIFSPOSIXCreate()
925 pSMB->Reserved3 = 0; in CIFSPOSIXCreate()
926 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSPOSIXCreate()
929 pSMB->DataCount = cpu_to_le16(count); in CIFSPOSIXCreate()
930 pSMB->ParameterCount = cpu_to_le16(params); in CIFSPOSIXCreate()
931 pSMB->TotalDataCount = pSMB->DataCount; in CIFSPOSIXCreate()
932 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSPOSIXCreate()
933 pSMB->InformationLevel = cpu_to_le16(SMB_POSIX_OPEN); in CIFSPOSIXCreate()
934 pSMB->Reserved4 = 0; in CIFSPOSIXCreate()
936 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSPOSIXCreate()
937 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSPOSIXCreate()
947 if (rc || get_bcc(&pSMBr->hdr) < sizeof(OPEN_PSX_RSP)) { in CIFSPOSIXCreate()
948 rc = -EIO; /* bad smb */ in CIFSPOSIXCreate()
953 psx_rsp = (OPEN_PSX_RSP *)((char *) &pSMBr->hdr.Protocol in CIFSPOSIXCreate()
954 + le16_to_cpu(pSMBr->t2.DataOffset)); in CIFSPOSIXCreate()
956 *pOplock = le16_to_cpu(psx_rsp->OplockFlags); in CIFSPOSIXCreate()
958 *netfid = psx_rsp->Fid; /* cifs fid stays in le */ in CIFSPOSIXCreate()
959 /* Let caller know file was created so we can set the mode. */ in CIFSPOSIXCreate()
961 if (cpu_to_le32(FILE_CREATE) == psx_rsp->CreateAction) in CIFSPOSIXCreate()
964 if (psx_rsp->ReturnedLevel != cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC)) { in CIFSPOSIXCreate()
965 pRetData->Type = cpu_to_le32(-1); /* unknown */ in CIFSPOSIXCreate()
968 if (get_bcc(&pSMBr->hdr) < sizeof(OPEN_PSX_RSP) in CIFSPOSIXCreate()
971 pRetData->Type = cpu_to_le32(-1); in CIFSPOSIXCreate()
983 cifs_stats_inc(&tcon->stats.cifs_stats.num_posixmkdirs); in CIFSPOSIXCreate()
985 cifs_stats_inc(&tcon->stats.cifs_stats.num_posixopens); in CIFSPOSIXCreate()
987 if (rc == -EAGAIN) in CIFSPOSIXCreate()
1057 pSMB->AndXCommand = 0xFF; /* none */ in SMBLegacyOpen()
1059 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in SMBLegacyOpen()
1062 cifsConvertToUTF16((__le16 *) (pSMB->fileName + 1), in SMBLegacyOpen()
1068 name_len = copy_path_name(pSMB->fileName, fileName); in SMBLegacyOpen()
1071 pSMB->OpenFlags = cpu_to_le16(REQ_OPLOCK); in SMBLegacyOpen()
1073 pSMB->OpenFlags = cpu_to_le16(REQ_BATCHOPLOCK); in SMBLegacyOpen()
1075 pSMB->OpenFlags |= cpu_to_le16(REQ_MORE_INFO); in SMBLegacyOpen()
1076 pSMB->Mode = cpu_to_le16(access_flags_to_smbopen_mode(access_flags)); in SMBLegacyOpen()
1077 pSMB->Mode |= cpu_to_le16(0x40); /* deny none */ in SMBLegacyOpen()
1078 /* set file as system file if special file such in SMBLegacyOpen()
1083 pSMB->FileAttributes = cpu_to_le16(ATTR_SYSTEM); in SMBLegacyOpen()
1085 pSMB->FileAttributes = cpu_to_le16(0/*ATTR_NORMAL*/); in SMBLegacyOpen()
1088 pSMB->FileAttributes |= cpu_to_le16(ATTR_READONLY); in SMBLegacyOpen()
1091 /* pSMB->CreateOptions = cpu_to_le32(create_options & in SMBLegacyOpen()
1095 pSMB->Sattr = cpu_to_le16(ATTR_HIDDEN | ATTR_SYSTEM | ATTR_DIRECTORY); in SMBLegacyOpen()
1096 pSMB->OpenFunction = cpu_to_le16(convert_disposition(openDisposition)); in SMBLegacyOpen()
1100 pSMB->ByteCount = cpu_to_le16(count); in SMBLegacyOpen()
1101 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in SMBLegacyOpen()
1103 cifs_stats_inc(&tcon->stats.cifs_stats.num_opens); in SMBLegacyOpen()
1109 /* *pOplock = pSMBr->OplockLevel; */ /* BB take from action field*/ in SMBLegacyOpen()
1111 *netfid = pSMBr->Fid; /* cifs fid stays in le */ in SMBLegacyOpen()
1112 /* Let caller know file was created so we can set the mode. */ in SMBLegacyOpen()
1115 /* if (cpu_to_le32(FILE_CREATE) == pSMBr->CreateAction) in SMBLegacyOpen()
1120 pfile_info->CreationTime = 0; /* BB convert CreateTime*/ in SMBLegacyOpen()
1121 pfile_info->LastAccessTime = 0; /* BB fixme */ in SMBLegacyOpen()
1122 pfile_info->LastWriteTime = 0; /* BB fixme */ in SMBLegacyOpen()
1123 pfile_info->ChangeTime = 0; /* BB fixme */ in SMBLegacyOpen()
1124 pfile_info->Attributes = in SMBLegacyOpen()
1125 cpu_to_le32(le16_to_cpu(pSMBr->FileAttributes)); in SMBLegacyOpen()
1127 pfile_info->AllocationSize = in SMBLegacyOpen()
1128 cpu_to_le64(le32_to_cpu(pSMBr->EndOfFile)); in SMBLegacyOpen()
1129 pfile_info->EndOfFile = pfile_info->AllocationSize; in SMBLegacyOpen()
1130 pfile_info->NumberOfLinks = cpu_to_le32(1); in SMBLegacyOpen()
1131 pfile_info->DeletePending = 0; in SMBLegacyOpen()
1136 if (rc == -EAGAIN) in SMBLegacyOpen()
1151 struct cifs_sb_info *cifs_sb = oparms->cifs_sb; in CIFS_open()
1152 struct cifs_tcon *tcon = oparms->tcon; in CIFS_open()
1154 const struct nls_table *nls = cifs_sb->local_nls; in CIFS_open()
1155 int create_options = oparms->create_options; in CIFS_open()
1156 int desired_access = oparms->desired_access; in CIFS_open()
1157 int disposition = oparms->disposition; in CIFS_open()
1158 const char *path = oparms->path; in CIFS_open()
1167 req->AndXCommand = 0xFF; in CIFS_open()
1169 if (req->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFS_open()
1172 name_len = cifsConvertToUTF16((__le16 *)(req->fileName + 1), in CIFS_open()
1177 req->NameLength = cpu_to_le16(name_len); in CIFS_open()
1182 name_len = copy_path_name(req->fileName, path); in CIFS_open()
1183 req->NameLength = cpu_to_le16(name_len); in CIFS_open()
1187 req->OpenFlags = cpu_to_le32(REQ_OPLOCK); in CIFS_open()
1189 req->OpenFlags = cpu_to_le32(REQ_BATCHOPLOCK); in CIFS_open()
1191 req->DesiredAccess = cpu_to_le32(desired_access); in CIFS_open()
1192 req->AllocationSize = 0; in CIFS_open()
1195 * Set file as system file if special file such as fifo and server in CIFS_open()
1199 req->FileAttributes = cpu_to_le32(ATTR_SYSTEM); in CIFS_open()
1201 req->FileAttributes = cpu_to_le32(ATTR_NORMAL); in CIFS_open()
1207 if (tcon->ses->capabilities & CAP_UNIX) in CIFS_open()
1208 req->FileAttributes |= cpu_to_le32(ATTR_POSIX_SEMANTICS); in CIFS_open()
1211 req->FileAttributes |= cpu_to_le32(ATTR_READONLY); in CIFS_open()
1213 req->ShareAccess = cpu_to_le32(FILE_SHARE_ALL); in CIFS_open()
1214 req->CreateDisposition = cpu_to_le32(disposition); in CIFS_open()
1215 req->CreateOptions = cpu_to_le32(create_options & CREATE_OPTIONS_MASK); in CIFS_open()
1218 req->ImpersonationLevel = cpu_to_le32(SECURITY_IMPERSONATION); in CIFS_open()
1219 req->SecurityFlags = SECURITY_CONTEXT_TRACKING|SECURITY_EFFECTIVE_ONLY; in CIFS_open()
1224 req->ByteCount = cpu_to_le16(count); in CIFS_open()
1225 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *)req, in CIFS_open()
1227 cifs_stats_inc(&tcon->stats.cifs_stats.num_opens); in CIFS_open()
1231 if (rc == -EAGAIN) in CIFS_open()
1237 *oplock = rsp->OplockLevel; in CIFS_open()
1239 oparms->fid->netfid = rsp->Fid; in CIFS_open()
1240 oparms->fid->access = desired_access; in CIFS_open()
1242 /* Let caller know file was created so we can set the mode. */ in CIFS_open()
1244 if (cpu_to_le32(FILE_CREATE) == rsp->CreateAction) in CIFS_open()
1249 memcpy(&buf->common_attributes, in CIFS_open()
1250 &rsp->common_attributes, in CIFS_open()
1251 sizeof(buf->common_attributes)); in CIFS_open()
1253 buf->AllocationSize = rsp->AllocationSize; in CIFS_open()
1254 buf->EndOfFile = rsp->EndOfFile; in CIFS_open()
1255 buf->NumberOfLinks = cpu_to_le32(1); in CIFS_open()
1256 buf->DeletePending = 0; in CIFS_open()
1266 struct cifs_readdata *rdata = mid->callback_data; in cifs_readv_callback()
1267 struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink); in cifs_readv_callback()
1268 struct TCP_Server_Info *server = tcon->ses->server; in cifs_readv_callback()
1269 struct smb_rqst rqst = { .rq_iov = rdata->iov, in cifs_readv_callback()
1271 .rq_iter_size = iov_iter_count(&rdata->iter), in cifs_readv_callback()
1272 .rq_iter = rdata->iter }; in cifs_readv_callback()
1276 __func__, mid->mid, mid->mid_state, rdata->result, in cifs_readv_callback()
1277 rdata->bytes); in cifs_readv_callback()
1279 switch (mid->mid_state) { in cifs_readv_callback()
1281 /* result already set, check signature */ in cifs_readv_callback()
1282 if (server->sign) { in cifs_readv_callback()
1286 mid->sequence_number); in cifs_readv_callback()
1292 task_io_account_read(rdata->got_bytes); in cifs_readv_callback()
1293 cifs_stats_bytes_read(tcon, rdata->got_bytes); in cifs_readv_callback()
1297 rdata->result = -EAGAIN; in cifs_readv_callback()
1298 if (server->sign && rdata->got_bytes) in cifs_readv_callback()
1300 rdata->got_bytes = 0; in cifs_readv_callback()
1302 task_io_account_read(rdata->got_bytes); in cifs_readv_callback()
1303 cifs_stats_bytes_read(tcon, rdata->got_bytes); in cifs_readv_callback()
1306 rdata->result = -EIO; in cifs_readv_callback()
1309 queue_work(cifsiod_wq, &rdata->work); in cifs_readv_callback()
1314 /* cifs_async_readv - send an async write, and set up mid to handle result */
1321 struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink); in cifs_async_readv()
1322 struct smb_rqst rqst = { .rq_iov = rdata->iov, in cifs_async_readv()
1326 __func__, rdata->offset, rdata->bytes); in cifs_async_readv()
1328 if (tcon->ses->capabilities & CAP_LARGE_FILES) in cifs_async_readv()
1332 if ((rdata->offset >> 32) > 0) { in cifs_async_readv()
1334 return -EIO; in cifs_async_readv()
1342 smb->hdr.Pid = cpu_to_le16((__u16)rdata->pid); in cifs_async_readv()
1343 smb->hdr.PidHigh = cpu_to_le16((__u16)(rdata->pid >> 16)); in cifs_async_readv()
1345 smb->AndXCommand = 0xFF; /* none */ in cifs_async_readv()
1346 smb->Fid = rdata->cfile->fid.netfid; in cifs_async_readv()
1347 smb->OffsetLow = cpu_to_le32(rdata->offset & 0xFFFFFFFF); in cifs_async_readv()
1349 smb->OffsetHigh = cpu_to_le32(rdata->offset >> 32); in cifs_async_readv()
1350 smb->Remaining = 0; in cifs_async_readv()
1351 smb->MaxCount = cpu_to_le16(rdata->bytes & 0xFFFF); in cifs_async_readv()
1352 smb->MaxCountHigh = cpu_to_le32(rdata->bytes >> 16); in cifs_async_readv()
1354 smb->ByteCount = 0; in cifs_async_readv()
1359 smbr->ByteCount = 0; in cifs_async_readv()
1363 rdata->iov[0].iov_base = smb; in cifs_async_readv()
1364 rdata->iov[0].iov_len = 4; in cifs_async_readv()
1365 rdata->iov[1].iov_base = (char *)smb + 4; in cifs_async_readv()
1366 rdata->iov[1].iov_len = get_rfc1002_length(smb); in cifs_async_readv()
1368 kref_get(&rdata->refcount); in cifs_async_readv()
1369 rc = cifs_call_async(tcon->ses->server, &rqst, cifs_readv_receive, in cifs_async_readv()
1373 cifs_stats_inc(&tcon->stats.cifs_stats.num_reads); in cifs_async_readv()
1375 kref_put(&rdata->refcount, cifs_readdata_release); in cifs_async_readv()
1385 int rc = -EACCES; in CIFSSMBRead()
1393 __u32 pid = io_parms->pid; in CIFSSMBRead()
1394 __u16 netfid = io_parms->netfid; in CIFSSMBRead()
1395 __u64 offset = io_parms->offset; in CIFSSMBRead()
1396 struct cifs_tcon *tcon = io_parms->tcon; in CIFSSMBRead()
1397 unsigned int count = io_parms->length; in CIFSSMBRead()
1400 if (tcon->ses->capabilities & CAP_LARGE_FILES) in CIFSSMBRead()
1406 return -EIO; in CIFSSMBRead()
1415 pSMB->hdr.Pid = cpu_to_le16((__u16)pid); in CIFSSMBRead()
1416 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid >> 16)); in CIFSSMBRead()
1419 if (tcon->ses->server == NULL) in CIFSSMBRead()
1420 return -ECONNABORTED; in CIFSSMBRead()
1422 pSMB->AndXCommand = 0xFF; /* none */ in CIFSSMBRead()
1423 pSMB->Fid = netfid; in CIFSSMBRead()
1424 pSMB->OffsetLow = cpu_to_le32(offset & 0xFFFFFFFF); in CIFSSMBRead()
1426 pSMB->OffsetHigh = cpu_to_le32(offset >> 32); in CIFSSMBRead()
1428 pSMB->Remaining = 0; in CIFSSMBRead()
1429 pSMB->MaxCount = cpu_to_le16(count & 0xFFFF); in CIFSSMBRead()
1430 pSMB->MaxCountHigh = cpu_to_le32(count >> 16); in CIFSSMBRead()
1432 pSMB->ByteCount = 0; /* no need to do le conversion since 0 */ in CIFSSMBRead()
1437 pSMBW->ByteCount = 0; in CIFSSMBRead()
1441 iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4; in CIFSSMBRead()
1442 rc = SendReceive2(xid, tcon->ses, iov, 1, &resp_buf_type, in CIFSSMBRead()
1445 cifs_stats_inc(&tcon->stats.cifs_stats.num_reads); in CIFSSMBRead()
1450 int data_length = le16_to_cpu(pSMBr->DataLengthHigh); in CIFSSMBRead()
1452 data_length += le16_to_cpu(pSMBr->DataLength); in CIFSSMBRead()
1460 rc = -EIO; in CIFSSMBRead()
1463 pReadData = (char *) (&pSMBr->hdr.Protocol) + in CIFSSMBRead()
1464 le16_to_cpu(pSMBr->DataOffset); in CIFSSMBRead()
1467 rc = -EFAULT; in CIFSSMBRead()
1483 } /* else no valid buffer on return - leave as null */ in CIFSSMBRead()
1485 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBRead()
1495 int rc = -EACCES; in CIFSSMBWrite()
1501 __u32 pid = io_parms->pid; in CIFSSMBWrite()
1502 __u16 netfid = io_parms->netfid; in CIFSSMBWrite()
1503 __u64 offset = io_parms->offset; in CIFSSMBWrite()
1504 struct cifs_tcon *tcon = io_parms->tcon; in CIFSSMBWrite()
1505 unsigned int count = io_parms->length; in CIFSSMBWrite()
1510 if (tcon->ses == NULL) in CIFSSMBWrite()
1511 return -ECONNABORTED; in CIFSSMBWrite()
1513 if (tcon->ses->capabilities & CAP_LARGE_FILES) in CIFSSMBWrite()
1519 return -EIO; in CIFSSMBWrite()
1528 pSMB->hdr.Pid = cpu_to_le16((__u16)pid); in CIFSSMBWrite()
1529 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid >> 16)); in CIFSSMBWrite()
1532 if (tcon->ses->server == NULL) in CIFSSMBWrite()
1533 return -ECONNABORTED; in CIFSSMBWrite()
1535 pSMB->AndXCommand = 0xFF; /* none */ in CIFSSMBWrite()
1536 pSMB->Fid = netfid; in CIFSSMBWrite()
1537 pSMB->OffsetLow = cpu_to_le32(offset & 0xFFFFFFFF); in CIFSSMBWrite()
1539 pSMB->OffsetHigh = cpu_to_le32(offset >> 32); in CIFSSMBWrite()
1541 pSMB->Reserved = 0xFFFFFFFF; in CIFSSMBWrite()
1542 pSMB->WriteMode = 0; in CIFSSMBWrite()
1543 pSMB->Remaining = 0; in CIFSSMBWrite()
1549 if (tcon->ses->capabilities & CAP_LARGE_WRITE_X) { in CIFSSMBWrite()
1552 bytes_sent = (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE) in CIFSSMBWrite()
1558 pSMB->DataOffset = in CIFSSMBWrite()
1559 cpu_to_le16(offsetof(struct smb_com_write_req, Data) - 4); in CIFSSMBWrite()
1561 memcpy(pSMB->Data, buf, bytes_sent); in CIFSSMBWrite()
1565 return -EINVAL; in CIFSSMBWrite()
1572 pSMB->DataLengthLow = cpu_to_le16(bytes_sent & 0xFFFF); in CIFSSMBWrite()
1573 pSMB->DataLengthHigh = cpu_to_le16(bytes_sent >> 16); in CIFSSMBWrite()
1577 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBWrite()
1582 pSMBW->ByteCount = cpu_to_le16(byte_count); in CIFSSMBWrite()
1585 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBWrite()
1587 cifs_stats_inc(&tcon->stats.cifs_stats.num_writes); in CIFSSMBWrite()
1591 *nbytes = le16_to_cpu(pSMBr->CountHigh); in CIFSSMBWrite()
1593 *nbytes += le16_to_cpu(pSMBr->Count); in CIFSSMBWrite()
1598 * OS/2 servers are known to set incorrect CountHigh values. in CIFSSMBWrite()
1606 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBWrite()
1619 struct cifs_writedata *wdata = mid->callback_data; in cifs_writev_callback()
1620 struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); in cifs_writev_callback()
1622 WRITE_RSP *smb = (WRITE_RSP *)mid->resp_buf; in cifs_writev_callback()
1625 switch (mid->mid_state) { in cifs_writev_callback()
1627 wdata->result = cifs_check_receive(mid, tcon->ses->server, 0); in cifs_writev_callback()
1628 if (wdata->result != 0) in cifs_writev_callback()
1631 written = le16_to_cpu(smb->CountHigh); in cifs_writev_callback()
1633 written += le16_to_cpu(smb->Count); in cifs_writev_callback()
1637 * client. OS/2 servers are known to set incorrect in cifs_writev_callback()
1640 if (written > wdata->bytes) in cifs_writev_callback()
1643 if (written < wdata->bytes) in cifs_writev_callback()
1644 wdata->result = -ENOSPC; in cifs_writev_callback()
1646 wdata->bytes = written; in cifs_writev_callback()
1650 wdata->result = -EAGAIN; in cifs_writev_callback()
1653 wdata->result = -EIO; in cifs_writev_callback()
1657 queue_work(cifsiod_wq, &wdata->work); in cifs_writev_callback()
1659 add_credits(tcon->ses->server, &credits, 0); in cifs_writev_callback()
1662 /* cifs_async_writev - send an async write, and set up mid to handle result */
1667 int rc = -EACCES; in cifs_async_writev()
1670 struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); in cifs_async_writev()
1674 if (tcon->ses->capabilities & CAP_LARGE_FILES) { in cifs_async_writev()
1678 if (wdata->offset >> 32 > 0) { in cifs_async_writev()
1680 return -EIO; in cifs_async_writev()
1688 smb->hdr.Pid = cpu_to_le16((__u16)wdata->pid); in cifs_async_writev()
1689 smb->hdr.PidHigh = cpu_to_le16((__u16)(wdata->pid >> 16)); in cifs_async_writev()
1691 smb->AndXCommand = 0xFF; /* none */ in cifs_async_writev()
1692 smb->Fid = wdata->cfile->fid.netfid; in cifs_async_writev()
1693 smb->OffsetLow = cpu_to_le32(wdata->offset & 0xFFFFFFFF); in cifs_async_writev()
1695 smb->OffsetHigh = cpu_to_le32(wdata->offset >> 32); in cifs_async_writev()
1696 smb->Reserved = 0xFFFFFFFF; in cifs_async_writev()
1697 smb->WriteMode = 0; in cifs_async_writev()
1698 smb->Remaining = 0; in cifs_async_writev()
1700 smb->DataOffset = in cifs_async_writev()
1701 cpu_to_le16(offsetof(struct smb_com_write_req, Data) - 4); in cifs_async_writev()
1711 rqst.rq_iter = wdata->iter; in cifs_async_writev()
1712 rqst.rq_iter_size = iov_iter_count(&wdata->iter); in cifs_async_writev()
1715 wdata->offset, wdata->bytes); in cifs_async_writev()
1717 smb->DataLengthLow = cpu_to_le16(wdata->bytes & 0xFFFF); in cifs_async_writev()
1718 smb->DataLengthHigh = cpu_to_le16(wdata->bytes >> 16); in cifs_async_writev()
1721 inc_rfc1001_len(&smb->hdr, wdata->bytes + 1); in cifs_async_writev()
1722 put_bcc(wdata->bytes + 1, &smb->hdr); in cifs_async_writev()
1727 inc_rfc1001_len(&smbw->hdr, wdata->bytes + 5); in cifs_async_writev()
1728 put_bcc(wdata->bytes + 5, &smbw->hdr); in cifs_async_writev()
1732 kref_get(&wdata->refcount); in cifs_async_writev()
1733 rc = cifs_call_async(tcon->ses->server, &rqst, NULL, in cifs_async_writev()
1737 cifs_stats_inc(&tcon->stats.cifs_stats.num_writes); in cifs_async_writev()
1739 kref_put(&wdata->refcount, release); in cifs_async_writev()
1755 __u32 pid = io_parms->pid; in CIFSSMBWrite2()
1756 __u16 netfid = io_parms->netfid; in CIFSSMBWrite2()
1757 __u64 offset = io_parms->offset; in CIFSSMBWrite2()
1758 struct cifs_tcon *tcon = io_parms->tcon; in CIFSSMBWrite2()
1759 unsigned int count = io_parms->length; in CIFSSMBWrite2()
1766 if (tcon->ses->capabilities & CAP_LARGE_FILES) { in CIFSSMBWrite2()
1772 return -EIO; in CIFSSMBWrite2()
1779 pSMB->hdr.Pid = cpu_to_le16((__u16)pid); in CIFSSMBWrite2()
1780 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid >> 16)); in CIFSSMBWrite2()
1783 if (tcon->ses->server == NULL) in CIFSSMBWrite2()
1784 return -ECONNABORTED; in CIFSSMBWrite2()
1786 pSMB->AndXCommand = 0xFF; /* none */ in CIFSSMBWrite2()
1787 pSMB->Fid = netfid; in CIFSSMBWrite2()
1788 pSMB->OffsetLow = cpu_to_le32(offset & 0xFFFFFFFF); in CIFSSMBWrite2()
1790 pSMB->OffsetHigh = cpu_to_le32(offset >> 32); in CIFSSMBWrite2()
1791 pSMB->Reserved = 0xFFFFFFFF; in CIFSSMBWrite2()
1792 pSMB->WriteMode = 0; in CIFSSMBWrite2()
1793 pSMB->Remaining = 0; in CIFSSMBWrite2()
1795 pSMB->DataOffset = in CIFSSMBWrite2()
1796 cpu_to_le16(offsetof(struct smb_com_write_req, Data) - 4); in CIFSSMBWrite2()
1798 pSMB->DataLengthLow = cpu_to_le16(count & 0xFFFF); in CIFSSMBWrite2()
1799 pSMB->DataLengthHigh = cpu_to_le16(count >> 16); in CIFSSMBWrite2()
1801 smb_hdr_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 1; in CIFSSMBWrite2()
1807 pSMB->ByteCount = cpu_to_le16(count + 1); in CIFSSMBWrite2()
1811 pSMBW->ByteCount = cpu_to_le16(count + 5); in CIFSSMBWrite2()
1819 rc = SendReceive2(xid, tcon->ses, iov, n_vec + 1, &resp_buf_type, 0, in CIFSSMBWrite2()
1822 cifs_stats_inc(&tcon->stats.cifs_stats.num_writes); in CIFSSMBWrite2()
1827 rc = -EIO; in CIFSSMBWrite2()
1830 *nbytes = le16_to_cpu(pSMBr->CountHigh); in CIFSSMBWrite2()
1832 *nbytes += le16_to_cpu(pSMBr->Count); in CIFSSMBWrite2()
1837 * servers are known to set incorrect CountHigh values. in CIFSSMBWrite2()
1845 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBWrite2()
1869 pSMB->Timeout = 0; in cifs_lockv()
1870 pSMB->NumberOfLocks = cpu_to_le16(num_lock); in cifs_lockv()
1871 pSMB->NumberOfUnlocks = cpu_to_le16(num_unlock); in cifs_lockv()
1872 pSMB->LockType = lock_type; in cifs_lockv()
1873 pSMB->AndXCommand = 0xFF; /* none */ in cifs_lockv()
1874 pSMB->Fid = netfid; /* netfid stays le */ in cifs_lockv()
1878 pSMB->ByteCount = cpu_to_le16(count); in cifs_lockv()
1881 iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4 - in cifs_lockv()
1886 cifs_stats_inc(&tcon->stats.cifs_stats.num_locks); in cifs_lockv()
1887 rc = SendReceive2(xid, tcon->ses, iov, 2, &resp_buf_type, in cifs_lockv()
1920 pSMB->Timeout = 0; in CIFSSMBLock()
1923 pSMB->Timeout = cpu_to_le32(-1);/* blocking - do not time out */ in CIFSSMBLock()
1925 pSMB->Timeout = 0; in CIFSSMBLock()
1928 pSMB->NumberOfLocks = cpu_to_le16(numLock); in CIFSSMBLock()
1929 pSMB->NumberOfUnlocks = cpu_to_le16(numUnlock); in CIFSSMBLock()
1930 pSMB->LockType = lockType; in CIFSSMBLock()
1931 pSMB->OplockLevel = oplock_level; in CIFSSMBLock()
1932 pSMB->AndXCommand = 0xFF; /* none */ in CIFSSMBLock()
1933 pSMB->Fid = smb_file_id; /* netfid stays le */ in CIFSSMBLock()
1936 pSMB->Locks[0].Pid = cpu_to_le16(netpid); in CIFSSMBLock()
1938 pSMB->Locks[0].LengthLow = cpu_to_le32((u32)len); in CIFSSMBLock()
1939 pSMB->Locks[0].LengthHigh = cpu_to_le32((u32)(len>>32)); in CIFSSMBLock()
1940 pSMB->Locks[0].OffsetLow = cpu_to_le32((u32)offset); in CIFSSMBLock()
1941 pSMB->Locks[0].OffsetHigh = cpu_to_le32((u32)(offset>>32)); in CIFSSMBLock()
1948 pSMB->ByteCount = cpu_to_le16(count); in CIFSSMBLock()
1954 rc = SendReceiveNoRsp(xid, tcon->ses, (char *)pSMB, flags); in CIFSSMBLock()
1956 cifs_stats_inc(&tcon->stats.cifs_stats.num_locks); in CIFSSMBLock()
1960 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBLock()
1993 pSMB->MaxSetupCount = 0; in CIFSSMBPosixLock()
1994 pSMB->Reserved = 0; in CIFSSMBPosixLock()
1995 pSMB->Flags = 0; in CIFSSMBPosixLock()
1996 pSMB->Reserved2 = 0; in CIFSSMBPosixLock()
1997 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBPosixLock()
2001 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBPosixLock()
2002 pSMB->MaxDataCount = cpu_to_le16(1000); /* BB find max SMB from sess */ in CIFSSMBPosixLock()
2003 pSMB->SetupCount = 1; in CIFSSMBPosixLock()
2004 pSMB->Reserved3 = 0; in CIFSSMBPosixLock()
2006 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FILE_INFORMATION); in CIFSSMBPosixLock()
2008 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBPosixLock()
2010 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBPosixLock()
2011 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBPosixLock()
2012 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBPosixLock()
2013 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBPosixLock()
2014 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBPosixLock()
2019 parm_data->lock_type = cpu_to_le16(lock_type); in CIFSSMBPosixLock()
2022 parm_data->lock_flags = cpu_to_le16(1); in CIFSSMBPosixLock()
2023 pSMB->Timeout = cpu_to_le32(-1); in CIFSSMBPosixLock()
2025 pSMB->Timeout = 0; in CIFSSMBPosixLock()
2027 parm_data->pid = cpu_to_le32(netpid); in CIFSSMBPosixLock()
2028 parm_data->start = cpu_to_le64(start_offset); in CIFSSMBPosixLock()
2029 parm_data->length = cpu_to_le64(len); /* normalize negative numbers */ in CIFSSMBPosixLock()
2031 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBPosixLock()
2032 pSMB->Fid = smb_file_id; in CIFSSMBPosixLock()
2033 pSMB->InformationLevel = cpu_to_le16(SMB_SET_POSIX_LOCK); in CIFSSMBPosixLock()
2034 pSMB->Reserved4 = 0; in CIFSSMBPosixLock()
2036 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBPosixLock()
2042 iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4; in CIFSSMBPosixLock()
2043 rc = SendReceive2(xid, tcon->ses, iov, 1 /* num iovecs */, in CIFSSMBPosixLock()
2057 if (rc || get_bcc(&pSMBr->hdr) < sizeof(*parm_data)) { in CIFSSMBPosixLock()
2058 rc = -EIO; /* bad smb */ in CIFSSMBPosixLock()
2061 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBPosixLock()
2062 data_count = le16_to_cpu(pSMBr->t2.DataCount); in CIFSSMBPosixLock()
2064 rc = -EIO; in CIFSSMBPosixLock()
2068 ((char *)&pSMBr->hdr.Protocol + data_offset); in CIFSSMBPosixLock()
2069 if (parm_data->lock_type == cpu_to_le16(CIFS_UNLCK)) in CIFSSMBPosixLock()
2070 pLockData->fl_type = F_UNLCK; in CIFSSMBPosixLock()
2072 if (parm_data->lock_type == in CIFSSMBPosixLock()
2074 pLockData->fl_type = F_RDLCK; in CIFSSMBPosixLock()
2075 else if (parm_data->lock_type == in CIFSSMBPosixLock()
2077 pLockData->fl_type = F_WRLCK; in CIFSSMBPosixLock()
2079 pLockData->fl_start = le64_to_cpu(parm_data->start); in CIFSSMBPosixLock()
2080 pLockData->fl_end = pLockData->fl_start + in CIFSSMBPosixLock()
2081 (le64_to_cpu(parm_data->length) ? in CIFSSMBPosixLock()
2082 le64_to_cpu(parm_data->length) - 1 : 0); in CIFSSMBPosixLock()
2083 pLockData->fl_pid = -le32_to_cpu(parm_data->pid); in CIFSSMBPosixLock()
2090 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBPosixLock()
2106 if (rc == -EAGAIN) in CIFSSMBClose()
2111 pSMB->FileID = (__u16) smb_file_id; in CIFSSMBClose()
2112 pSMB->LastWriteTime = 0xFFFFFFFF; in CIFSSMBClose()
2113 pSMB->ByteCount = 0; in CIFSSMBClose()
2114 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBClose()
2116 cifs_stats_inc(&tcon->stats.cifs_stats.num_closes); in CIFSSMBClose()
2118 if (rc != -EINTR) { in CIFSSMBClose()
2119 /* EINTR is expected when user ctl-c to kill app */ in CIFSSMBClose()
2125 if (rc == -EAGAIN) in CIFSSMBClose()
2142 pSMB->FileID = (__u16) smb_file_id; in CIFSSMBFlush()
2143 pSMB->ByteCount = 0; in CIFSSMBFlush()
2144 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBFlush()
2146 cifs_stats_inc(&tcon->stats.cifs_stats.num_flushes); in CIFSSMBFlush()
2173 pSMB->BufferFormat = 0x04; in CIFSSMBRename()
2174 pSMB->SearchAttributes = in CIFSSMBRename()
2178 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBRename()
2179 name_len = cifsConvertToUTF16((__le16 *) pSMB->OldFileName, in CIFSSMBRename()
2181 cifs_sb->local_nls, remap); in CIFSSMBRename()
2184 pSMB->OldFileName[name_len] = 0x04; /* pad */ in CIFSSMBRename()
2186 pSMB->OldFileName[name_len + 1] = 0x00; in CIFSSMBRename()
2188 cifsConvertToUTF16((__le16 *)&pSMB->OldFileName[name_len+2], in CIFSSMBRename()
2189 to_name, PATH_MAX, cifs_sb->local_nls, in CIFSSMBRename()
2194 name_len = copy_path_name(pSMB->OldFileName, from_name); in CIFSSMBRename()
2195 name_len2 = copy_path_name(pSMB->OldFileName+name_len+1, to_name); in CIFSSMBRename()
2196 pSMB->OldFileName[name_len] = 0x04; /* 2nd buffer format */ in CIFSSMBRename()
2202 pSMB->ByteCount = cpu_to_le16(count); in CIFSSMBRename()
2204 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBRename()
2206 cifs_stats_inc(&tcon->stats.cifs_stats.num_renames); in CIFSSMBRename()
2212 if (rc == -EAGAIN) in CIFSSMBRename()
2239 pSMB->MaxSetupCount = 0; in CIFSSMBRenameOpenFile()
2240 pSMB->Reserved = 0; in CIFSSMBRenameOpenFile()
2241 pSMB->Flags = 0; in CIFSSMBRenameOpenFile()
2242 pSMB->Timeout = 0; in CIFSSMBRenameOpenFile()
2243 pSMB->Reserved2 = 0; in CIFSSMBRenameOpenFile()
2244 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBRenameOpenFile()
2250 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBRenameOpenFile()
2251 pSMB->MaxDataCount = cpu_to_le16(1000); /* BB find max SMB from sess */ in CIFSSMBRenameOpenFile()
2252 pSMB->SetupCount = 1; in CIFSSMBRenameOpenFile()
2253 pSMB->Reserved3 = 0; in CIFSSMBRenameOpenFile()
2254 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBRenameOpenFile()
2256 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBRenameOpenFile()
2257 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBRenameOpenFile()
2258 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBRenameOpenFile()
2259 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBRenameOpenFile()
2261 rename_info->overwrite = cpu_to_le32(1); in CIFSSMBRenameOpenFile()
2262 rename_info->root_fid = 0; in CIFSSMBRenameOpenFile()
2265 sprintf(dummy_string, "cifs%x", pSMB->hdr.Mid); in CIFSSMBRenameOpenFile()
2267 cifsConvertToUTF16((__le16 *)rename_info->target_name, in CIFSSMBRenameOpenFile()
2271 cifsConvertToUTF16((__le16 *)rename_info->target_name, in CIFSSMBRenameOpenFile()
2275 rename_info->target_name_len = cpu_to_le32(2 * len_of_str); in CIFSSMBRenameOpenFile()
2278 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBRenameOpenFile()
2279 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBRenameOpenFile()
2280 pSMB->Fid = netfid; in CIFSSMBRenameOpenFile()
2281 pSMB->InformationLevel = in CIFSSMBRenameOpenFile()
2283 pSMB->Reserved4 = 0; in CIFSSMBRenameOpenFile()
2285 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBRenameOpenFile()
2286 rc = SendReceive(xid, pTcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBRenameOpenFile()
2288 cifs_stats_inc(&pTcon->stats.cifs_stats.num_t2renames); in CIFSSMBRenameOpenFile()
2295 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBRenameOpenFile()
2320 pSMB->BufferFormat = 0x04; in CIFSSMBCopy()
2321 pSMB->Tid2 = target_tid; in CIFSSMBCopy()
2323 pSMB->Flags = cpu_to_le16(flags & COPY_TREE); in CIFSSMBCopy()
2325 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBCopy()
2326 name_len = cifsConvertToUTF16((__le16 *) pSMB->OldFileName, in CIFSSMBCopy()
2331 pSMB->OldFileName[name_len] = 0x04; /* pad */ in CIFSSMBCopy()
2333 pSMB->OldFileName[name_len + 1] = 0x00; in CIFSSMBCopy()
2335 cifsConvertToUTF16((__le16 *)&pSMB->OldFileName[name_len+2], in CIFSSMBCopy()
2340 name_len = copy_path_name(pSMB->OldFileName, fromName); in CIFSSMBCopy()
2341 pSMB->OldFileName[name_len] = 0x04; /* 2nd buffer format */ in CIFSSMBCopy()
2342 name_len2 = copy_path_name(pSMB->OldFileName+name_len+1, toName); in CIFSSMBCopy()
2348 pSMB->ByteCount = cpu_to_le16(count); in CIFSSMBCopy()
2350 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBCopy()
2354 rc, le16_to_cpu(pSMBr->CopyCount)); in CIFSSMBCopy()
2358 if (rc == -EAGAIN) in CIFSSMBCopy()
2385 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSUnixCreateSymLink()
2387 cifsConvertToUTF16((__le16 *) pSMB->FileName, fromName, in CIFSUnixCreateSymLink()
2394 name_len = copy_path_name(pSMB->FileName, fromName); in CIFSUnixCreateSymLink()
2397 pSMB->MaxSetupCount = 0; in CIFSUnixCreateSymLink()
2398 pSMB->Reserved = 0; in CIFSUnixCreateSymLink()
2399 pSMB->Flags = 0; in CIFSUnixCreateSymLink()
2400 pSMB->Timeout = 0; in CIFSUnixCreateSymLink()
2401 pSMB->Reserved2 = 0; in CIFSUnixCreateSymLink()
2403 InformationLevel) - 4; in CIFSUnixCreateSymLink()
2408 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSUnixCreateSymLink()
2419 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSUnixCreateSymLink()
2421 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSUnixCreateSymLink()
2422 pSMB->SetupCount = 1; in CIFSUnixCreateSymLink()
2423 pSMB->Reserved3 = 0; in CIFSUnixCreateSymLink()
2424 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSUnixCreateSymLink()
2426 pSMB->DataCount = cpu_to_le16(name_len_target); in CIFSUnixCreateSymLink()
2427 pSMB->ParameterCount = cpu_to_le16(params); in CIFSUnixCreateSymLink()
2428 pSMB->TotalDataCount = pSMB->DataCount; in CIFSUnixCreateSymLink()
2429 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSUnixCreateSymLink()
2430 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSUnixCreateSymLink()
2431 pSMB->DataOffset = cpu_to_le16(offset); in CIFSUnixCreateSymLink()
2432 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_UNIX_LINK); in CIFSUnixCreateSymLink()
2433 pSMB->Reserved4 = 0; in CIFSUnixCreateSymLink()
2435 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSUnixCreateSymLink()
2436 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSUnixCreateSymLink()
2438 cifs_stats_inc(&tcon->stats.cifs_stats.num_symlinks); in CIFSUnixCreateSymLink()
2445 if (rc == -EAGAIN) in CIFSUnixCreateSymLink()
2472 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSUnixCreateHardLink()
2473 name_len = cifsConvertToUTF16((__le16 *) pSMB->FileName, toName, in CIFSUnixCreateHardLink()
2479 name_len = copy_path_name(pSMB->FileName, toName); in CIFSUnixCreateHardLink()
2482 pSMB->MaxSetupCount = 0; in CIFSUnixCreateHardLink()
2483 pSMB->Reserved = 0; in CIFSUnixCreateHardLink()
2484 pSMB->Flags = 0; in CIFSUnixCreateHardLink()
2485 pSMB->Timeout = 0; in CIFSUnixCreateHardLink()
2486 pSMB->Reserved2 = 0; in CIFSUnixCreateHardLink()
2488 InformationLevel) - 4; in CIFSUnixCreateHardLink()
2493 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSUnixCreateHardLink()
2503 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSUnixCreateHardLink()
2505 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSUnixCreateHardLink()
2506 pSMB->SetupCount = 1; in CIFSUnixCreateHardLink()
2507 pSMB->Reserved3 = 0; in CIFSUnixCreateHardLink()
2508 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSUnixCreateHardLink()
2510 pSMB->ParameterCount = cpu_to_le16(params); in CIFSUnixCreateHardLink()
2511 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSUnixCreateHardLink()
2512 pSMB->DataCount = cpu_to_le16(name_len_target); in CIFSUnixCreateHardLink()
2513 pSMB->TotalDataCount = pSMB->DataCount; in CIFSUnixCreateHardLink()
2514 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSUnixCreateHardLink()
2515 pSMB->DataOffset = cpu_to_le16(offset); in CIFSUnixCreateHardLink()
2516 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_UNIX_HLINK); in CIFSUnixCreateHardLink()
2517 pSMB->Reserved4 = 0; in CIFSUnixCreateHardLink()
2519 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSUnixCreateHardLink()
2520 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSUnixCreateHardLink()
2522 cifs_stats_inc(&tcon->stats.cifs_stats.num_hardlinks); in CIFSUnixCreateHardLink()
2528 if (rc == -EAGAIN) in CIFSUnixCreateHardLink()
2556 pSMB->SearchAttributes = in CIFSCreateHardLink()
2559 pSMB->Flags = cpu_to_le16(CREATE_HARD_LINK); in CIFSCreateHardLink()
2560 pSMB->ClusterCount = 0; in CIFSCreateHardLink()
2562 pSMB->BufferFormat = 0x04; in CIFSCreateHardLink()
2564 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSCreateHardLink()
2566 cifsConvertToUTF16((__le16 *) pSMB->OldFileName, from_name, in CIFSCreateHardLink()
2567 PATH_MAX, cifs_sb->local_nls, remap); in CIFSCreateHardLink()
2572 pSMB->OldFileName[name_len] = 0x04; in CIFSCreateHardLink()
2573 pSMB->OldFileName[name_len + 1] = 0x00; /* pad */ in CIFSCreateHardLink()
2575 cifsConvertToUTF16((__le16 *)&pSMB->OldFileName[name_len+2], in CIFSCreateHardLink()
2576 to_name, PATH_MAX, cifs_sb->local_nls, in CIFSCreateHardLink()
2581 name_len = copy_path_name(pSMB->OldFileName, from_name); in CIFSCreateHardLink()
2582 pSMB->OldFileName[name_len] = 0x04; /* 2nd buffer format */ in CIFSCreateHardLink()
2583 name_len2 = copy_path_name(pSMB->OldFileName+name_len+1, to_name); in CIFSCreateHardLink()
2589 pSMB->ByteCount = cpu_to_le16(count); in CIFSCreateHardLink()
2591 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSCreateHardLink()
2593 cifs_stats_inc(&tcon->stats.cifs_stats.num_hardlinks); in CIFSCreateHardLink()
2598 if (rc == -EAGAIN) in CIFSCreateHardLink()
2626 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBUnixQuerySymLink()
2628 cifsConvertToUTF16((__le16 *) pSMB->FileName, in CIFSSMBUnixQuerySymLink()
2634 name_len = copy_path_name(pSMB->FileName, searchName); in CIFSSMBUnixQuerySymLink()
2638 pSMB->TotalDataCount = 0; in CIFSSMBUnixQuerySymLink()
2639 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBUnixQuerySymLink()
2640 pSMB->MaxDataCount = cpu_to_le16(CIFSMaxBufSize); in CIFSSMBUnixQuerySymLink()
2641 pSMB->MaxSetupCount = 0; in CIFSSMBUnixQuerySymLink()
2642 pSMB->Reserved = 0; in CIFSSMBUnixQuerySymLink()
2643 pSMB->Flags = 0; in CIFSSMBUnixQuerySymLink()
2644 pSMB->Timeout = 0; in CIFSSMBUnixQuerySymLink()
2645 pSMB->Reserved2 = 0; in CIFSSMBUnixQuerySymLink()
2646 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBUnixQuerySymLink()
2647 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSSMBUnixQuerySymLink()
2648 pSMB->DataCount = 0; in CIFSSMBUnixQuerySymLink()
2649 pSMB->DataOffset = 0; in CIFSSMBUnixQuerySymLink()
2650 pSMB->SetupCount = 1; in CIFSSMBUnixQuerySymLink()
2651 pSMB->Reserved3 = 0; in CIFSSMBUnixQuerySymLink()
2652 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSSMBUnixQuerySymLink()
2654 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBUnixQuerySymLink()
2655 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBUnixQuerySymLink()
2656 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_UNIX_LINK); in CIFSSMBUnixQuerySymLink()
2657 pSMB->Reserved4 = 0; in CIFSSMBUnixQuerySymLink()
2659 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixQuerySymLink()
2661 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBUnixQuerySymLink()
2670 if (rc || get_bcc(&pSMBr->hdr) < 2) in CIFSSMBUnixQuerySymLink()
2671 rc = -EIO; in CIFSSMBUnixQuerySymLink()
2674 u16 count = le16_to_cpu(pSMBr->t2.DataCount); in CIFSSMBUnixQuerySymLink()
2676 data_start = ((char *) &pSMBr->hdr.Protocol) + in CIFSSMBUnixQuerySymLink()
2677 le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBUnixQuerySymLink()
2679 if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) in CIFSSMBUnixQuerySymLink()
2688 rc = -ENOMEM; in CIFSSMBUnixQuerySymLink()
2692 if (rc == -EAGAIN) in CIFSSMBUnixQuerySymLink()
2717 if (cap_unix(tcon->ses)) in cifs_query_reparse_point()
2718 return -EOPNOTSUPP; in cifs_query_reparse_point()
2740 io_req->TotalParameterCount = 0; in cifs_query_reparse_point()
2741 io_req->TotalDataCount = 0; in cifs_query_reparse_point()
2742 io_req->MaxParameterCount = cpu_to_le32(0); in cifs_query_reparse_point()
2744 io_req->MaxDataCount = cpu_to_le32(CIFSMaxBufSize & 0xFFFFFF00); in cifs_query_reparse_point()
2745 io_req->MaxSetupCount = 1; in cifs_query_reparse_point()
2746 io_req->Reserved = 0; in cifs_query_reparse_point()
2747 io_req->ParameterOffset = 0; in cifs_query_reparse_point()
2748 io_req->DataCount = 0; in cifs_query_reparse_point()
2749 io_req->DataOffset = 0; in cifs_query_reparse_point()
2750 io_req->SetupCount = 4; in cifs_query_reparse_point()
2751 io_req->SubCommand = cpu_to_le16(NT_TRANSACT_IOCTL); in cifs_query_reparse_point()
2752 io_req->ParameterCount = io_req->TotalParameterCount; in cifs_query_reparse_point()
2753 io_req->FunctionCode = cpu_to_le32(FSCTL_GET_REPARSE_POINT); in cifs_query_reparse_point()
2754 io_req->IsFsctl = 1; in cifs_query_reparse_point()
2755 io_req->IsRootFlag = 0; in cifs_query_reparse_point()
2756 io_req->Fid = fid.netfid; in cifs_query_reparse_point()
2757 io_req->ByteCount = 0; in cifs_query_reparse_point()
2759 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *)io_req, in cifs_query_reparse_point()
2764 data_offset = le32_to_cpu(io_rsp->DataOffset); in cifs_query_reparse_point()
2765 data_count = le32_to_cpu(io_rsp->DataCount); in cifs_query_reparse_point()
2766 if (get_bcc(&io_rsp->hdr) < 2 || data_offset > 512 || in cifs_query_reparse_point()
2768 rc = -EIO; in cifs_query_reparse_point()
2773 if (io_rsp->SetupCount != 1) { in cifs_query_reparse_point()
2774 rc = -EIO; in cifs_query_reparse_point()
2783 if (data_count != le16_to_cpu(io_rsp->ReturnedDataLen)) { in cifs_query_reparse_point()
2784 rc = -EIO; in cifs_query_reparse_point()
2788 end = 2 + get_bcc(&io_rsp->hdr) + (__u8 *)&io_rsp->ByteCount; in cifs_query_reparse_point()
2789 start = (__u8 *)&io_rsp->hdr.Protocol + data_offset; in cifs_query_reparse_point()
2791 rc = -EIO; in cifs_query_reparse_point()
2795 data_count = le16_to_cpu(io_rsp->ByteCount); in cifs_query_reparse_point()
2799 data_count < le16_to_cpu(buf->ReparseDataLength) + len) { in cifs_query_reparse_point()
2800 rc = -EIO; in cifs_query_reparse_point()
2804 *tag = le32_to_cpu(buf->ReparseTag); in cifs_query_reparse_point()
2805 rsp->iov_base = io_rsp; in cifs_query_reparse_point()
2806 rsp->iov_len = io_rsp_len; in cifs_query_reparse_point()
2826 cifs_dbg(FYI, "Set compression for %u\n", fid); in CIFSSMB_set_compression()
2832 pSMB->compression_state = cpu_to_le16(COMPRESSION_FORMAT_DEFAULT); in CIFSSMB_set_compression()
2834 pSMB->TotalParameterCount = 0; in CIFSSMB_set_compression()
2835 pSMB->TotalDataCount = cpu_to_le32(2); in CIFSSMB_set_compression()
2836 pSMB->MaxParameterCount = 0; in CIFSSMB_set_compression()
2837 pSMB->MaxDataCount = 0; in CIFSSMB_set_compression()
2838 pSMB->MaxSetupCount = 4; in CIFSSMB_set_compression()
2839 pSMB->Reserved = 0; in CIFSSMB_set_compression()
2840 pSMB->ParameterOffset = 0; in CIFSSMB_set_compression()
2841 pSMB->DataCount = cpu_to_le32(2); in CIFSSMB_set_compression()
2842 pSMB->DataOffset = in CIFSSMB_set_compression()
2844 compression_state) - 4); /* 84 */ in CIFSSMB_set_compression()
2845 pSMB->SetupCount = 4; in CIFSSMB_set_compression()
2846 pSMB->SubCommand = cpu_to_le16(NT_TRANSACT_IOCTL); in CIFSSMB_set_compression()
2847 pSMB->ParameterCount = 0; in CIFSSMB_set_compression()
2848 pSMB->FunctionCode = cpu_to_le32(FSCTL_SET_COMPRESSION); in CIFSSMB_set_compression()
2849 pSMB->IsFsctl = 1; /* FSCTL */ in CIFSSMB_set_compression()
2850 pSMB->IsRootFlag = 0; in CIFSSMB_set_compression()
2851 pSMB->Fid = fid; /* file handle always le */ in CIFSSMB_set_compression()
2853 pSMB->ByteCount = cpu_to_le16(5); in CIFSSMB_set_compression()
2856 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMB_set_compression()
2864 * Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMB_set_compression()
2875 * cifs_init_posix_acl - convert ACL from cifs to POSIX ACL format
2888 ace->e_perm = cifs_ace->cifs_e_perm; in cifs_init_posix_acl()
2889 ace->e_tag = cifs_ace->cifs_e_tag; in cifs_init_posix_acl()
2891 switch (ace->e_tag) { in cifs_init_posix_acl()
2893 ace->e_uid = make_kuid(&init_user_ns, in cifs_init_posix_acl()
2894 le64_to_cpu(cifs_ace->cifs_uid)); in cifs_init_posix_acl()
2897 ace->e_gid = make_kgid(&init_user_ns, in cifs_init_posix_acl()
2898 le64_to_cpu(cifs_ace->cifs_uid)); in cifs_init_posix_acl()
2905 * cifs_to_posix_acl - copy cifs ACL format to POSIX ACL format
2925 if (le16_to_cpu(cifs_acl->version) != CIFS_ACL_VERSION) in cifs_to_posix_acl()
2926 return -EOPNOTSUPP; in cifs_to_posix_acl()
2929 count = le16_to_cpu(cifs_acl->access_entry_count); in cifs_to_posix_acl()
2930 pACE = &cifs_acl->ace_array[0]; in cifs_to_posix_acl()
2937 return -EINVAL; in cifs_to_posix_acl()
2940 count = le16_to_cpu(cifs_acl->access_entry_count); in cifs_to_posix_acl()
2943 /* skip past access ACEs to get to default ACEs */ in cifs_to_posix_acl()
2944 pACE = &cifs_acl->ace_array[count]; in cifs_to_posix_acl()
2945 count = le16_to_cpu(cifs_acl->default_entry_count); in cifs_to_posix_acl()
2949 return -EINVAL; in cifs_to_posix_acl()
2952 return -EINVAL; in cifs_to_posix_acl()
2958 return -ENOMEM; in cifs_to_posix_acl()
2970 * cifs_init_ace - convert ACL entry from POSIX ACL to cifs format
2977 cifs_ace->cifs_e_perm = local_ace->e_perm; in cifs_init_ace()
2978 cifs_ace->cifs_e_tag = local_ace->e_tag; in cifs_init_ace()
2980 switch (local_ace->e_tag) { in cifs_init_ace()
2982 cifs_ace->cifs_uid = in cifs_init_ace()
2983 cpu_to_le64(from_kuid(&init_user_ns, local_ace->e_uid)); in cifs_init_ace()
2986 cifs_ace->cifs_uid = in cifs_init_ace()
2987 cpu_to_le64(from_kgid(&init_user_ns, local_ace->e_gid)); in cifs_init_ace()
2990 cifs_ace->cifs_uid = cpu_to_le64(-1); in cifs_init_ace()
2995 * posix_acl_to_cifs - convert ACLs from POSIX ACL to cifs format
3014 count = acl->a_count; in posix_acl_to_cifs()
3024 cifs_acl->version = cpu_to_le16(1); in posix_acl_to_cifs()
3026 cifs_acl->access_entry_count = cpu_to_le16(count); in posix_acl_to_cifs()
3027 cifs_acl->default_entry_count = cpu_to_le16(0xFFFF); in posix_acl_to_cifs()
3029 cifs_acl->default_entry_count = cpu_to_le16(count); in posix_acl_to_cifs()
3030 cifs_acl->access_entry_count = cpu_to_le16(0xFFFF); in posix_acl_to_cifs()
3036 cifs_init_ace(&cifs_acl->ace_array[i++], pa); in posix_acl_to_cifs()
3067 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in cifs_do_get_acl()
3069 cifsConvertToUTF16((__le16 *) pSMB->FileName, in cifs_do_get_acl()
3074 pSMB->FileName[name_len] = 0; in cifs_do_get_acl()
3075 pSMB->FileName[name_len+1] = 0; in cifs_do_get_acl()
3077 name_len = copy_path_name(pSMB->FileName, searchName); in cifs_do_get_acl()
3081 pSMB->TotalDataCount = 0; in cifs_do_get_acl()
3082 pSMB->MaxParameterCount = cpu_to_le16(2); in cifs_do_get_acl()
3084 pSMB->MaxDataCount = cpu_to_le16(4000); in cifs_do_get_acl()
3085 pSMB->MaxSetupCount = 0; in cifs_do_get_acl()
3086 pSMB->Reserved = 0; in cifs_do_get_acl()
3087 pSMB->Flags = 0; in cifs_do_get_acl()
3088 pSMB->Timeout = 0; in cifs_do_get_acl()
3089 pSMB->Reserved2 = 0; in cifs_do_get_acl()
3090 pSMB->ParameterOffset = cpu_to_le16( in cifs_do_get_acl()
3092 InformationLevel) - 4); in cifs_do_get_acl()
3093 pSMB->DataCount = 0; in cifs_do_get_acl()
3094 pSMB->DataOffset = 0; in cifs_do_get_acl()
3095 pSMB->SetupCount = 1; in cifs_do_get_acl()
3096 pSMB->Reserved3 = 0; in cifs_do_get_acl()
3097 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in cifs_do_get_acl()
3099 pSMB->TotalParameterCount = cpu_to_le16(params); in cifs_do_get_acl()
3100 pSMB->ParameterCount = pSMB->TotalParameterCount; in cifs_do_get_acl()
3101 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_POSIX_ACL); in cifs_do_get_acl()
3102 pSMB->Reserved4 = 0; in cifs_do_get_acl()
3104 pSMB->ByteCount = cpu_to_le16(byte_count); in cifs_do_get_acl()
3106 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in cifs_do_get_acl()
3108 cifs_stats_inc(&tcon->stats.cifs_stats.num_acl_get); in cifs_do_get_acl()
3116 if (rc || get_bcc(&pSMBr->hdr) < 2) in cifs_do_get_acl()
3117 rc = -EIO; /* bad smb */ in cifs_do_get_acl()
3119 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in cifs_do_get_acl()
3120 __u16 count = le16_to_cpu(pSMBr->t2.DataCount); in cifs_do_get_acl()
3122 (char *)&pSMBr->hdr.Protocol+data_offset, in cifs_do_get_acl()
3132 if (rc == -EAGAIN) in cifs_do_get_acl()
3156 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in cifs_do_set_acl()
3158 cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, in cifs_do_set_acl()
3163 name_len = copy_path_name(pSMB->FileName, fileName); in cifs_do_set_acl()
3166 pSMB->MaxParameterCount = cpu_to_le16(2); in cifs_do_set_acl()
3168 pSMB->MaxDataCount = cpu_to_le16(1000); in cifs_do_set_acl()
3169 pSMB->MaxSetupCount = 0; in cifs_do_set_acl()
3170 pSMB->Reserved = 0; in cifs_do_set_acl()
3171 pSMB->Flags = 0; in cifs_do_set_acl()
3172 pSMB->Timeout = 0; in cifs_do_set_acl()
3173 pSMB->Reserved2 = 0; in cifs_do_set_acl()
3175 InformationLevel) - 4; in cifs_do_set_acl()
3177 parm_data = ((char *)pSMB) + sizeof(pSMB->hdr.smb_buf_length) + offset; in cifs_do_set_acl()
3178 pSMB->ParameterOffset = cpu_to_le16(param_offset); in cifs_do_set_acl()
3184 rc = -EOPNOTSUPP; in cifs_do_set_acl()
3187 pSMB->DataOffset = cpu_to_le16(offset); in cifs_do_set_acl()
3188 pSMB->SetupCount = 1; in cifs_do_set_acl()
3189 pSMB->Reserved3 = 0; in cifs_do_set_acl()
3190 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in cifs_do_set_acl()
3191 pSMB->InformationLevel = cpu_to_le16(SMB_SET_POSIX_ACL); in cifs_do_set_acl()
3193 pSMB->DataCount = cpu_to_le16(data_count); in cifs_do_set_acl()
3194 pSMB->TotalDataCount = pSMB->DataCount; in cifs_do_set_acl()
3195 pSMB->ParameterCount = cpu_to_le16(params); in cifs_do_set_acl()
3196 pSMB->TotalParameterCount = pSMB->ParameterCount; in cifs_do_set_acl()
3197 pSMB->Reserved4 = 0; in cifs_do_set_acl()
3199 pSMB->ByteCount = cpu_to_le16(byte_count); in cifs_do_set_acl()
3200 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in cifs_do_set_acl()
3203 cifs_dbg(FYI, "Set POSIX ACL returned %d\n", rc); in cifs_do_set_acl()
3207 if (rc == -EAGAIN) in cifs_do_set_acl()
3217 return -EOPNOTSUPP; in cifs_do_get_acl()
3225 return -EOPNOTSUPP; in cifs_do_set_acl()
3241 return -ENODEV; in CIFSGetExtAttr()
3250 pSMB->t2.TotalDataCount = 0; in CIFSGetExtAttr()
3251 pSMB->t2.MaxParameterCount = cpu_to_le16(4); in CIFSGetExtAttr()
3253 pSMB->t2.MaxDataCount = cpu_to_le16(4000); in CIFSGetExtAttr()
3254 pSMB->t2.MaxSetupCount = 0; in CIFSGetExtAttr()
3255 pSMB->t2.Reserved = 0; in CIFSGetExtAttr()
3256 pSMB->t2.Flags = 0; in CIFSGetExtAttr()
3257 pSMB->t2.Timeout = 0; in CIFSGetExtAttr()
3258 pSMB->t2.Reserved2 = 0; in CIFSGetExtAttr()
3259 pSMB->t2.ParameterOffset = cpu_to_le16(offsetof(struct smb_t2_qfi_req, in CIFSGetExtAttr()
3260 Fid) - 4); in CIFSGetExtAttr()
3261 pSMB->t2.DataCount = 0; in CIFSGetExtAttr()
3262 pSMB->t2.DataOffset = 0; in CIFSGetExtAttr()
3263 pSMB->t2.SetupCount = 1; in CIFSGetExtAttr()
3264 pSMB->t2.Reserved3 = 0; in CIFSGetExtAttr()
3265 pSMB->t2.SubCommand = cpu_to_le16(TRANS2_QUERY_FILE_INFORMATION); in CIFSGetExtAttr()
3267 pSMB->t2.TotalParameterCount = cpu_to_le16(params); in CIFSGetExtAttr()
3268 pSMB->t2.ParameterCount = pSMB->t2.TotalParameterCount; in CIFSGetExtAttr()
3269 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_ATTR_FLAGS); in CIFSGetExtAttr()
3270 pSMB->Pad = 0; in CIFSGetExtAttr()
3271 pSMB->Fid = netfid; in CIFSGetExtAttr()
3273 pSMB->t2.ByteCount = cpu_to_le16(byte_count); in CIFSGetExtAttr()
3275 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSGetExtAttr()
3283 if (rc || get_bcc(&pSMBr->hdr) < 2) in CIFSGetExtAttr()
3286 rc = -EIO; /* bad smb */ in CIFSGetExtAttr()
3288 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSGetExtAttr()
3289 __u16 count = le16_to_cpu(pSMBr->t2.DataCount); in CIFSGetExtAttr()
3294 rc = -EIO; in CIFSGetExtAttr()
3298 (data_offset + (char *) &pSMBr->hdr.Protocol); in CIFSGetExtAttr()
3299 *pExtAttrBits = le64_to_cpu(pfinfo->mode); in CIFSGetExtAttr()
3300 *pMask = le64_to_cpu(pfinfo->mask); in CIFSGetExtAttr()
3305 if (rc == -EAGAIN) in CIFSGetExtAttr()
3317 * returned setup area) and MaxParameterCount (returned parms size) must be set
3334 pSMB->Reserved = 0; in smb_init_nttransact()
3335 pSMB->TotalParameterCount = cpu_to_le32(parm_len); in smb_init_nttransact()
3336 pSMB->TotalDataCount = 0; in smb_init_nttransact()
3337 pSMB->MaxDataCount = cpu_to_le32(CIFSMaxBufSize & 0xFFFFFF00); in smb_init_nttransact()
3338 pSMB->ParameterCount = pSMB->TotalParameterCount; in smb_init_nttransact()
3339 pSMB->DataCount = pSMB->TotalDataCount; in smb_init_nttransact()
3341 (setup_count * 2) - 4 /* for rfc1001 length itself */; in smb_init_nttransact()
3342 pSMB->ParameterOffset = cpu_to_le32(temp_offset); in smb_init_nttransact()
3343 pSMB->DataOffset = cpu_to_le32(temp_offset + parm_len); in smb_init_nttransact()
3344 pSMB->SetupCount = setup_count; /* no need to le convert byte fields */ in smb_init_nttransact()
3345 pSMB->SubCommand = cpu_to_le16(sub_command); in smb_init_nttransact()
3362 return -EINVAL; in validate_ntransact()
3366 bcc = get_bcc(&pSMBr->hdr); in validate_ntransact()
3368 (char *)&pSMBr->ByteCount; in validate_ntransact()
3370 data_offset = le32_to_cpu(pSMBr->DataOffset); in validate_ntransact()
3371 data_count = le32_to_cpu(pSMBr->DataCount); in validate_ntransact()
3372 parm_offset = le32_to_cpu(pSMBr->ParameterOffset); in validate_ntransact()
3373 parm_count = le32_to_cpu(pSMBr->ParameterCount); in validate_ntransact()
3375 *ppparm = (char *)&pSMBr->hdr.Protocol + parm_offset; in validate_ntransact()
3376 *ppdata = (char *)&pSMBr->hdr.Protocol + data_offset; in validate_ntransact()
3381 return -EINVAL; in validate_ntransact()
3384 return -EINVAL; in validate_ntransact()
3387 return -EINVAL; in validate_ntransact()
3392 return -EINVAL; in validate_ntransact()
3395 return -EINVAL; in validate_ntransact()
3423 pSMB->MaxParameterCount = cpu_to_le32(4); in CIFSSMBGetCIFSACL()
3425 pSMB->MaxSetupCount = 0; in CIFSSMBGetCIFSACL()
3426 pSMB->Fid = fid; /* file handle always le */ in CIFSSMBGetCIFSACL()
3427 pSMB->AclFlags = cpu_to_le32(CIFS_ACL_OWNER | CIFS_ACL_GROUP | in CIFSSMBGetCIFSACL()
3429 pSMB->ByteCount = cpu_to_le16(11); /* 3 bytes pad + 8 bytes parm */ in CIFSSMBGetCIFSACL()
3432 iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4; in CIFSSMBGetCIFSACL()
3434 rc = SendReceive2(xid, tcon->ses, iov, 1 /* num iovec */, &buf_type, in CIFSSMBGetCIFSACL()
3437 cifs_stats_inc(&tcon->stats.cifs_stats.num_acl_get); in CIFSSMBGetCIFSACL()
3457 if (le32_to_cpu(pSMBr->ParameterCount) != 4) { in CIFSSMBGetCIFSACL()
3458 rc = -EIO; /* bad smb */ in CIFSSMBGetCIFSACL()
3478 rc = -EINVAL; in CIFSSMBGetCIFSACL()
3484 rc = -ENOMEM; in CIFSSMBGetCIFSACL()
3508 pSMB->MaxSetupCount = 0; in CIFSSMBSetCIFSACL()
3509 pSMB->Reserved = 0; in CIFSSMBSetCIFSACL()
3512 param_offset = offsetof(struct smb_com_transaction_ssec_req, Fid) - 4; in CIFSSMBSetCIFSACL()
3517 pSMB->DataCount = cpu_to_le32(data_count); in CIFSSMBSetCIFSACL()
3518 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetCIFSACL()
3519 pSMB->MaxParameterCount = cpu_to_le32(4); in CIFSSMBSetCIFSACL()
3520 pSMB->MaxDataCount = cpu_to_le32(16384); in CIFSSMBSetCIFSACL()
3521 pSMB->ParameterCount = cpu_to_le32(param_count); in CIFSSMBSetCIFSACL()
3522 pSMB->ParameterOffset = cpu_to_le32(param_offset); in CIFSSMBSetCIFSACL()
3523 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetCIFSACL()
3524 pSMB->DataOffset = cpu_to_le32(data_offset); in CIFSSMBSetCIFSACL()
3525 pSMB->SetupCount = 0; in CIFSSMBSetCIFSACL()
3526 pSMB->SubCommand = cpu_to_le16(NT_TRANSACT_SET_SECURITY_DESC); in CIFSSMBSetCIFSACL()
3527 pSMB->ByteCount = cpu_to_le16(byte_count+data_count); in CIFSSMBSetCIFSACL()
3529 pSMB->Fid = fid; /* file handle always le */ in CIFSSMBSetCIFSACL()
3530 pSMB->Reserved2 = 0; in CIFSSMBSetCIFSACL()
3531 pSMB->AclFlags = cpu_to_le32(aclflag); in CIFSSMBSetCIFSACL()
3540 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetCIFSACL()
3546 cifs_dbg(FYI, "Set CIFS ACL returned %d\n", rc); in CIFSSMBSetCIFSACL()
3549 if (rc == -EAGAIN) in CIFSSMBSetCIFSACL()
3576 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in SMBQueryInformation()
3578 cifsConvertToUTF16((__le16 *) pSMB->FileName, in SMBQueryInformation()
3584 name_len = copy_path_name(pSMB->FileName, search_name); in SMBQueryInformation()
3586 pSMB->BufferFormat = 0x04; in SMBQueryInformation()
3589 pSMB->ByteCount = cpu_to_le16(name_len); in SMBQueryInformation()
3591 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in SMBQueryInformation()
3597 __u32 time = le32_to_cpu(pSMBr->last_write_time); in SMBQueryInformation()
3600 /* BB FIXME - add time zone adjustment BB */ in SMBQueryInformation()
3605 data->ChangeTime = cpu_to_le64(cifs_UnixTimeToNT(ts)); in SMBQueryInformation()
3606 data->LastWriteTime = data->ChangeTime; in SMBQueryInformation()
3607 data->LastAccessTime = 0; in SMBQueryInformation()
3608 data->AllocationSize = in SMBQueryInformation()
3609 cpu_to_le64(le32_to_cpu(pSMBr->size)); in SMBQueryInformation()
3610 data->EndOfFile = data->AllocationSize; in SMBQueryInformation()
3611 data->Attributes = in SMBQueryInformation()
3612 cpu_to_le32(le16_to_cpu(pSMBr->attr)); in SMBQueryInformation()
3614 rc = -EIO; /* bad buffer passed in */ in SMBQueryInformation()
3618 if (rc == -EAGAIN) in SMBQueryInformation()
3641 pSMB->t2.TotalDataCount = 0; in CIFSSMBQFileInfo()
3642 pSMB->t2.MaxParameterCount = cpu_to_le16(4); in CIFSSMBQFileInfo()
3644 pSMB->t2.MaxDataCount = cpu_to_le16(CIFSMaxBufSize); in CIFSSMBQFileInfo()
3645 pSMB->t2.MaxSetupCount = 0; in CIFSSMBQFileInfo()
3646 pSMB->t2.Reserved = 0; in CIFSSMBQFileInfo()
3647 pSMB->t2.Flags = 0; in CIFSSMBQFileInfo()
3648 pSMB->t2.Timeout = 0; in CIFSSMBQFileInfo()
3649 pSMB->t2.Reserved2 = 0; in CIFSSMBQFileInfo()
3650 pSMB->t2.ParameterOffset = cpu_to_le16(offsetof(struct smb_t2_qfi_req, in CIFSSMBQFileInfo()
3651 Fid) - 4); in CIFSSMBQFileInfo()
3652 pSMB->t2.DataCount = 0; in CIFSSMBQFileInfo()
3653 pSMB->t2.DataOffset = 0; in CIFSSMBQFileInfo()
3654 pSMB->t2.SetupCount = 1; in CIFSSMBQFileInfo()
3655 pSMB->t2.Reserved3 = 0; in CIFSSMBQFileInfo()
3656 pSMB->t2.SubCommand = cpu_to_le16(TRANS2_QUERY_FILE_INFORMATION); in CIFSSMBQFileInfo()
3658 pSMB->t2.TotalParameterCount = cpu_to_le16(params); in CIFSSMBQFileInfo()
3659 pSMB->t2.ParameterCount = pSMB->t2.TotalParameterCount; in CIFSSMBQFileInfo()
3660 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_ALL_INFO); in CIFSSMBQFileInfo()
3661 pSMB->Pad = 0; in CIFSSMBQFileInfo()
3662 pSMB->Fid = netfid; in CIFSSMBQFileInfo()
3664 pSMB->t2.ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFileInfo()
3666 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFileInfo()
3674 rc = -EIO; in CIFSSMBQFileInfo()
3675 else if (get_bcc(&pSMBr->hdr) < 40) in CIFSSMBQFileInfo()
3676 rc = -EIO; /* bad smb */ in CIFSSMBQFileInfo()
3678 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFileInfo()
3680 (char *) &pSMBr->hdr.Protocol + in CIFSSMBQFileInfo()
3683 rc = -ENOMEM; in CIFSSMBQFileInfo()
3686 if (rc == -EAGAIN) in CIFSSMBQFileInfo()
3713 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBQPathInfo()
3715 cifsConvertToUTF16((__le16 *) pSMB->FileName, search_name, in CIFSSMBQPathInfo()
3720 name_len = copy_path_name(pSMB->FileName, search_name); in CIFSSMBQPathInfo()
3724 pSMB->TotalDataCount = 0; in CIFSSMBQPathInfo()
3725 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQPathInfo()
3727 pSMB->MaxDataCount = cpu_to_le16(4000); in CIFSSMBQPathInfo()
3728 pSMB->MaxSetupCount = 0; in CIFSSMBQPathInfo()
3729 pSMB->Reserved = 0; in CIFSSMBQPathInfo()
3730 pSMB->Flags = 0; in CIFSSMBQPathInfo()
3731 pSMB->Timeout = 0; in CIFSSMBQPathInfo()
3732 pSMB->Reserved2 = 0; in CIFSSMBQPathInfo()
3733 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQPathInfo()
3734 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSSMBQPathInfo()
3735 pSMB->DataCount = 0; in CIFSSMBQPathInfo()
3736 pSMB->DataOffset = 0; in CIFSSMBQPathInfo()
3737 pSMB->SetupCount = 1; in CIFSSMBQPathInfo()
3738 pSMB->Reserved3 = 0; in CIFSSMBQPathInfo()
3739 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSSMBQPathInfo()
3741 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQPathInfo()
3742 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQPathInfo()
3744 pSMB->InformationLevel = cpu_to_le16(SMB_INFO_STANDARD); in CIFSSMBQPathInfo()
3746 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_ALL_INFO); in CIFSSMBQPathInfo()
3747 pSMB->Reserved4 = 0; in CIFSSMBQPathInfo()
3749 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQPathInfo()
3751 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQPathInfo()
3759 rc = -EIO; in CIFSSMBQPathInfo()
3760 else if (!legacy && get_bcc(&pSMBr->hdr) < 40) in CIFSSMBQPathInfo()
3761 rc = -EIO; /* bad smb */ in CIFSSMBQPathInfo()
3762 else if (legacy && get_bcc(&pSMBr->hdr) < 24) in CIFSSMBQPathInfo()
3763 rc = -EIO; /* 24 or 26 expected but we do not read in CIFSSMBQPathInfo()
3767 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQPathInfo()
3772 * also note it differs on Set vs Get, ie two bytes or 4 in CIFSSMBQPathInfo()
3779 memcpy((char *) data, (char *) &pSMBr->hdr.Protocol + in CIFSSMBQPathInfo()
3782 rc = -ENOMEM; in CIFSSMBQPathInfo()
3785 if (rc == -EAGAIN) in CIFSSMBQPathInfo()
3808 pSMB->t2.TotalDataCount = 0; in CIFSSMBUnixQFileInfo()
3809 pSMB->t2.MaxParameterCount = cpu_to_le16(4); in CIFSSMBUnixQFileInfo()
3811 pSMB->t2.MaxDataCount = cpu_to_le16(CIFSMaxBufSize); in CIFSSMBUnixQFileInfo()
3812 pSMB->t2.MaxSetupCount = 0; in CIFSSMBUnixQFileInfo()
3813 pSMB->t2.Reserved = 0; in CIFSSMBUnixQFileInfo()
3814 pSMB->t2.Flags = 0; in CIFSSMBUnixQFileInfo()
3815 pSMB->t2.Timeout = 0; in CIFSSMBUnixQFileInfo()
3816 pSMB->t2.Reserved2 = 0; in CIFSSMBUnixQFileInfo()
3817 pSMB->t2.ParameterOffset = cpu_to_le16(offsetof(struct smb_t2_qfi_req, in CIFSSMBUnixQFileInfo()
3818 Fid) - 4); in CIFSSMBUnixQFileInfo()
3819 pSMB->t2.DataCount = 0; in CIFSSMBUnixQFileInfo()
3820 pSMB->t2.DataOffset = 0; in CIFSSMBUnixQFileInfo()
3821 pSMB->t2.SetupCount = 1; in CIFSSMBUnixQFileInfo()
3822 pSMB->t2.Reserved3 = 0; in CIFSSMBUnixQFileInfo()
3823 pSMB->t2.SubCommand = cpu_to_le16(TRANS2_QUERY_FILE_INFORMATION); in CIFSSMBUnixQFileInfo()
3825 pSMB->t2.TotalParameterCount = cpu_to_le16(params); in CIFSSMBUnixQFileInfo()
3826 pSMB->t2.ParameterCount = pSMB->t2.TotalParameterCount; in CIFSSMBUnixQFileInfo()
3827 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC); in CIFSSMBUnixQFileInfo()
3828 pSMB->Pad = 0; in CIFSSMBUnixQFileInfo()
3829 pSMB->Fid = netfid; in CIFSSMBUnixQFileInfo()
3831 pSMB->t2.ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixQFileInfo()
3833 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBUnixQFileInfo()
3840 if (rc || get_bcc(&pSMBr->hdr) < sizeof(FILE_UNIX_BASIC_INFO)) { in CIFSSMBUnixQFileInfo()
3842 rc = -EIO; /* bad smb */ in CIFSSMBUnixQFileInfo()
3844 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBUnixQFileInfo()
3846 (char *) &pSMBr->hdr.Protocol + in CIFSSMBUnixQFileInfo()
3853 if (rc == -EAGAIN) in CIFSSMBUnixQFileInfo()
3880 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBUnixQPathInfo()
3882 cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, in CIFSSMBUnixQPathInfo()
3887 name_len = copy_path_name(pSMB->FileName, searchName); in CIFSSMBUnixQPathInfo()
3891 pSMB->TotalDataCount = 0; in CIFSSMBUnixQPathInfo()
3892 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBUnixQPathInfo()
3894 pSMB->MaxDataCount = cpu_to_le16(4000); in CIFSSMBUnixQPathInfo()
3895 pSMB->MaxSetupCount = 0; in CIFSSMBUnixQPathInfo()
3896 pSMB->Reserved = 0; in CIFSSMBUnixQPathInfo()
3897 pSMB->Flags = 0; in CIFSSMBUnixQPathInfo()
3898 pSMB->Timeout = 0; in CIFSSMBUnixQPathInfo()
3899 pSMB->Reserved2 = 0; in CIFSSMBUnixQPathInfo()
3900 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBUnixQPathInfo()
3901 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSSMBUnixQPathInfo()
3902 pSMB->DataCount = 0; in CIFSSMBUnixQPathInfo()
3903 pSMB->DataOffset = 0; in CIFSSMBUnixQPathInfo()
3904 pSMB->SetupCount = 1; in CIFSSMBUnixQPathInfo()
3905 pSMB->Reserved3 = 0; in CIFSSMBUnixQPathInfo()
3906 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSSMBUnixQPathInfo()
3908 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBUnixQPathInfo()
3909 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBUnixQPathInfo()
3910 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC); in CIFSSMBUnixQPathInfo()
3911 pSMB->Reserved4 = 0; in CIFSSMBUnixQPathInfo()
3913 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixQPathInfo()
3915 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBUnixQPathInfo()
3922 if (rc || get_bcc(&pSMBr->hdr) < sizeof(FILE_UNIX_BASIC_INFO)) { in CIFSSMBUnixQPathInfo()
3924 rc = -EIO; /* bad smb */ in CIFSSMBUnixQPathInfo()
3926 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBUnixQPathInfo()
3928 (char *) &pSMBr->hdr.Protocol + in CIFSSMBUnixQPathInfo()
3934 if (rc == -EAGAIN) in CIFSSMBUnixQPathInfo()
3966 nls_codepage = cifs_sb->local_nls; in CIFSFindFirst()
3969 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSFindFirst()
3971 cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, in CIFSFindFirst()
3978 pSMB->FileName[name_len] = CIFS_DIR_SEP(cifs_sb); in CIFSFindFirst()
3979 pSMB->FileName[name_len+1] = 0; in CIFSFindFirst()
3980 pSMB->FileName[name_len+2] = '*'; in CIFSFindFirst()
3981 pSMB->FileName[name_len+3] = 0; in CIFSFindFirst()
3984 pSMB->FileName[name_len] = 0; in CIFSFindFirst()
3985 pSMB->FileName[name_len+1] = 0; in CIFSFindFirst()
3989 name_len = copy_path_name(pSMB->FileName, searchName); in CIFSFindFirst()
3991 if (WARN_ON_ONCE(name_len > PATH_MAX-2)) in CIFSFindFirst()
3992 name_len = PATH_MAX-2; in CIFSFindFirst()
3994 pSMB->FileName[name_len-1] = CIFS_DIR_SEP(cifs_sb); in CIFSFindFirst()
3995 pSMB->FileName[name_len] = '*'; in CIFSFindFirst()
3996 pSMB->FileName[name_len+1] = 0; in CIFSFindFirst()
4002 pSMB->TotalDataCount = 0; /* no EAs */ in CIFSFindFirst()
4003 pSMB->MaxParameterCount = cpu_to_le16(10); in CIFSFindFirst()
4004 pSMB->MaxDataCount = cpu_to_le16(CIFSMaxBufSize & 0xFFFFFF00); in CIFSFindFirst()
4005 pSMB->MaxSetupCount = 0; in CIFSFindFirst()
4006 pSMB->Reserved = 0; in CIFSFindFirst()
4007 pSMB->Flags = 0; in CIFSFindFirst()
4008 pSMB->Timeout = 0; in CIFSFindFirst()
4009 pSMB->Reserved2 = 0; in CIFSFindFirst()
4011 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSFindFirst()
4012 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSFindFirst()
4013 pSMB->ParameterOffset = cpu_to_le16( in CIFSFindFirst()
4015 - 4); in CIFSFindFirst()
4016 pSMB->DataCount = 0; in CIFSFindFirst()
4017 pSMB->DataOffset = 0; in CIFSFindFirst()
4018 pSMB->SetupCount = 1; /* one byte, no need to make endian neutral */ in CIFSFindFirst()
4019 pSMB->Reserved3 = 0; in CIFSFindFirst()
4020 pSMB->SubCommand = cpu_to_le16(TRANS2_FIND_FIRST); in CIFSFindFirst()
4021 pSMB->SearchAttributes = in CIFSFindFirst()
4024 pSMB->SearchCount = cpu_to_le16(CIFSMaxBufSize/sizeof(FILE_UNIX_INFO)); in CIFSFindFirst()
4025 pSMB->SearchFlags = cpu_to_le16(search_flags); in CIFSFindFirst()
4026 pSMB->InformationLevel = cpu_to_le16(psrch_inf->info_level); in CIFSFindFirst()
4028 /* BB what should we set StorageType to? Does it matter? BB */ in CIFSFindFirst()
4029 pSMB->SearchStorageType = 0; in CIFSFindFirst()
4031 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSFindFirst()
4033 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSFindFirst()
4035 cifs_stats_inc(&tcon->stats.cifs_stats.num_ffirst); in CIFSFindFirst()
4049 if (rc == -EAGAIN) in CIFSFindFirst()
4060 psrch_inf->unicode = !!(pSMBr->hdr.Flags2 & SMBFLG2_UNICODE); in CIFSFindFirst()
4061 psrch_inf->ntwrk_buf_start = (char *)pSMBr; in CIFSFindFirst()
4062 psrch_inf->smallBuf = false; in CIFSFindFirst()
4063 psrch_inf->srch_entries_start = (char *)&pSMBr->hdr.Protocol + in CIFSFindFirst()
4064 le16_to_cpu(pSMBr->t2.DataOffset); in CIFSFindFirst()
4066 parms = (T2_FFIRST_RSP_PARMS *)((char *)&pSMBr->hdr.Protocol + in CIFSFindFirst()
4067 le16_to_cpu(pSMBr->t2.ParameterOffset)); in CIFSFindFirst()
4068 psrch_inf->endOfSearch = !!parms->EndofSearch; in CIFSFindFirst()
4070 psrch_inf->entries_in_buffer = le16_to_cpu(parms->SearchCount); in CIFSFindFirst()
4071 psrch_inf->index_of_last_entry = 2 /* skip . and .. */ + in CIFSFindFirst()
4072 psrch_inf->entries_in_buffer; in CIFSFindFirst()
4073 lnoff = le16_to_cpu(parms->LastNameOffset); in CIFSFindFirst()
4076 psrch_inf->last_entry = NULL; in CIFSFindFirst()
4078 psrch_inf->last_entry = psrch_inf->srch_entries_start + lnoff; in CIFSFindFirst()
4080 *pnetfid = parms->SearchHandle; in CIFSFindFirst()
4101 if (psrch_inf->endOfSearch) in CIFSFindNext()
4102 return -ENOENT; in CIFSFindNext()
4111 pSMB->TotalDataCount = 0; /* no EAs */ in CIFSFindNext()
4112 pSMB->MaxParameterCount = cpu_to_le16(8); in CIFSFindNext()
4113 pSMB->MaxDataCount = cpu_to_le16(CIFSMaxBufSize & 0xFFFFFF00); in CIFSFindNext()
4114 pSMB->MaxSetupCount = 0; in CIFSFindNext()
4115 pSMB->Reserved = 0; in CIFSFindNext()
4116 pSMB->Flags = 0; in CIFSFindNext()
4117 pSMB->Timeout = 0; in CIFSFindNext()
4118 pSMB->Reserved2 = 0; in CIFSFindNext()
4119 pSMB->ParameterOffset = cpu_to_le16( in CIFSFindNext()
4120 offsetof(struct smb_com_transaction2_fnext_req,SearchHandle) - 4); in CIFSFindNext()
4121 pSMB->DataCount = 0; in CIFSFindNext()
4122 pSMB->DataOffset = 0; in CIFSFindNext()
4123 pSMB->SetupCount = 1; in CIFSFindNext()
4124 pSMB->Reserved3 = 0; in CIFSFindNext()
4125 pSMB->SubCommand = cpu_to_le16(TRANS2_FIND_NEXT); in CIFSFindNext()
4126 pSMB->SearchHandle = searchHandle; /* always kept as le */ in CIFSFindNext()
4127 pSMB->SearchCount = in CIFSFindNext()
4129 pSMB->InformationLevel = cpu_to_le16(psrch_inf->info_level); in CIFSFindNext()
4130 pSMB->ResumeKey = psrch_inf->resume_key; in CIFSFindNext()
4131 pSMB->SearchFlags = cpu_to_le16(search_flags); in CIFSFindNext()
4133 name_len = psrch_inf->resume_name_len; in CIFSFindNext()
4136 memcpy(pSMB->ResumeFileName, psrch_inf->presume_name, name_len); in CIFSFindNext()
4139 pSMB->ResumeFileName[name_len] = 0; in CIFSFindNext()
4140 pSMB->ResumeFileName[name_len+1] = 0; in CIFSFindNext()
4143 return -EINVAL; in CIFSFindNext()
4146 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSFindNext()
4147 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSFindNext()
4149 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSFindNext()
4151 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSFindNext()
4153 cifs_stats_inc(&tcon->stats.cifs_stats.num_fnext); in CIFSFindNext()
4157 if (rc == -EBADF) { in CIFSFindNext()
4158 psrch_inf->endOfSearch = true; in CIFSFindNext()
4173 psrch_inf->unicode = !!(pSMBr->hdr.Flags2 & SMBFLG2_UNICODE); in CIFSFindNext()
4174 response_data = (char *)&pSMBr->hdr.Protocol + in CIFSFindNext()
4175 le16_to_cpu(pSMBr->t2.ParameterOffset); in CIFSFindNext()
4177 response_data = (char *)&pSMBr->hdr.Protocol + in CIFSFindNext()
4178 le16_to_cpu(pSMBr->t2.DataOffset); in CIFSFindNext()
4180 if (psrch_inf->smallBuf) in CIFSFindNext()
4181 cifs_small_buf_release(psrch_inf->ntwrk_buf_start); in CIFSFindNext()
4183 cifs_buf_release(psrch_inf->ntwrk_buf_start); in CIFSFindNext()
4185 psrch_inf->srch_entries_start = response_data; in CIFSFindNext()
4186 psrch_inf->ntwrk_buf_start = (char *)pSMB; in CIFSFindNext()
4187 psrch_inf->smallBuf = false; in CIFSFindNext()
4188 psrch_inf->endOfSearch = !!parms->EndofSearch; in CIFSFindNext()
4189 psrch_inf->entries_in_buffer = le16_to_cpu(parms->SearchCount); in CIFSFindNext()
4190 psrch_inf->index_of_last_entry += psrch_inf->entries_in_buffer; in CIFSFindNext()
4191 lnoff = le16_to_cpu(parms->LastNameOffset); in CIFSFindNext()
4194 psrch_inf->last_entry = NULL; in CIFSFindNext()
4196 psrch_inf->last_entry = in CIFSFindNext()
4197 psrch_inf->srch_entries_start + lnoff; in CIFSFindNext()
4205 * Note: On -EAGAIN error only caller can retry on handle based calls in CIFSFindNext()
4223 if (rc == -EAGAIN) in CIFSFindClose()
4228 pSMB->FileID = searchHandle; in CIFSFindClose()
4229 pSMB->ByteCount = 0; in CIFSFindClose()
4230 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSFindClose()
4235 cifs_stats_inc(&tcon->stats.cifs_stats.num_fclose); in CIFSFindClose()
4238 if (rc == -EAGAIN) in CIFSFindClose()
4257 return -ENODEV; in CIFSGetSrvInodeNumber()
4265 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSGetSrvInodeNumber()
4267 cifsConvertToUTF16((__le16 *) pSMB->FileName, in CIFSGetSrvInodeNumber()
4273 name_len = copy_path_name(pSMB->FileName, search_name); in CIFSGetSrvInodeNumber()
4277 pSMB->TotalDataCount = 0; in CIFSGetSrvInodeNumber()
4278 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSGetSrvInodeNumber()
4280 pSMB->MaxDataCount = cpu_to_le16(4000); in CIFSGetSrvInodeNumber()
4281 pSMB->MaxSetupCount = 0; in CIFSGetSrvInodeNumber()
4282 pSMB->Reserved = 0; in CIFSGetSrvInodeNumber()
4283 pSMB->Flags = 0; in CIFSGetSrvInodeNumber()
4284 pSMB->Timeout = 0; in CIFSGetSrvInodeNumber()
4285 pSMB->Reserved2 = 0; in CIFSGetSrvInodeNumber()
4286 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSGetSrvInodeNumber()
4287 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSGetSrvInodeNumber()
4288 pSMB->DataCount = 0; in CIFSGetSrvInodeNumber()
4289 pSMB->DataOffset = 0; in CIFSGetSrvInodeNumber()
4290 pSMB->SetupCount = 1; in CIFSGetSrvInodeNumber()
4291 pSMB->Reserved3 = 0; in CIFSGetSrvInodeNumber()
4292 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSGetSrvInodeNumber()
4294 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSGetSrvInodeNumber()
4295 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSGetSrvInodeNumber()
4296 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_INTERNAL_INFO); in CIFSGetSrvInodeNumber()
4297 pSMB->Reserved4 = 0; in CIFSGetSrvInodeNumber()
4299 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSGetSrvInodeNumber()
4301 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSGetSrvInodeNumber()
4309 if (rc || get_bcc(&pSMBr->hdr) < 2) in CIFSGetSrvInodeNumber()
4312 rc = -EIO; /* bad smb */ in CIFSGetSrvInodeNumber()
4314 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSGetSrvInodeNumber()
4315 __u16 count = le16_to_cpu(pSMBr->t2.DataCount); in CIFSGetSrvInodeNumber()
4320 rc = -EIO; in CIFSGetSrvInodeNumber()
4324 (data_offset + (char *) &pSMBr->hdr.Protocol); in CIFSGetSrvInodeNumber()
4325 *inode_number = le64_to_cpu(pfinfo->UniqueId); in CIFSGetSrvInodeNumber()
4330 if (rc == -EAGAIN) in CIFSGetSrvInodeNumber()
4352 if (ses == NULL || ses->tcon_ipc == NULL) in CIFSGetDFSRefer()
4353 return -ENODEV; in CIFSGetDFSRefer()
4361 rc = smb_init_no_reconnect(SMB_COM_TRANSACTION2, 15, ses->tcon_ipc, in CIFSGetDFSRefer()
4368 pSMB->hdr.Mid = get_next_mid(ses->server); in CIFSGetDFSRefer()
4369 pSMB->hdr.Tid = ses->tcon_ipc->tid; in CIFSGetDFSRefer()
4370 pSMB->hdr.Uid = ses->Suid; in CIFSGetDFSRefer()
4371 if (ses->capabilities & CAP_STATUS32) in CIFSGetDFSRefer()
4372 pSMB->hdr.Flags2 |= SMBFLG2_ERR_STATUS; in CIFSGetDFSRefer()
4373 if (ses->capabilities & CAP_DFS) in CIFSGetDFSRefer()
4374 pSMB->hdr.Flags2 |= SMBFLG2_DFS; in CIFSGetDFSRefer()
4376 if (ses->capabilities & CAP_UNICODE) { in CIFSGetDFSRefer()
4377 pSMB->hdr.Flags2 |= SMBFLG2_UNICODE; in CIFSGetDFSRefer()
4379 cifsConvertToUTF16((__le16 *) pSMB->RequestFileName, in CIFSGetDFSRefer()
4385 name_len = copy_path_name(pSMB->RequestFileName, search_name); in CIFSGetDFSRefer()
4388 if (ses->server->sign) in CIFSGetDFSRefer()
4389 pSMB->hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE; in CIFSGetDFSRefer()
4391 pSMB->hdr.Uid = ses->Suid; in CIFSGetDFSRefer()
4394 pSMB->TotalDataCount = 0; in CIFSGetDFSRefer()
4395 pSMB->DataCount = 0; in CIFSGetDFSRefer()
4396 pSMB->DataOffset = 0; in CIFSGetDFSRefer()
4397 pSMB->MaxParameterCount = 0; in CIFSGetDFSRefer()
4399 pSMB->MaxDataCount = cpu_to_le16(4000); in CIFSGetDFSRefer()
4400 pSMB->MaxSetupCount = 0; in CIFSGetDFSRefer()
4401 pSMB->Reserved = 0; in CIFSGetDFSRefer()
4402 pSMB->Flags = 0; in CIFSGetDFSRefer()
4403 pSMB->Timeout = 0; in CIFSGetDFSRefer()
4404 pSMB->Reserved2 = 0; in CIFSGetDFSRefer()
4405 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSGetDFSRefer()
4406 struct smb_com_transaction2_get_dfs_refer_req, MaxReferralLevel) - 4); in CIFSGetDFSRefer()
4407 pSMB->SetupCount = 1; in CIFSGetDFSRefer()
4408 pSMB->Reserved3 = 0; in CIFSGetDFSRefer()
4409 pSMB->SubCommand = cpu_to_le16(TRANS2_GET_DFS_REFERRAL); in CIFSGetDFSRefer()
4411 pSMB->ParameterCount = cpu_to_le16(params); in CIFSGetDFSRefer()
4412 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSGetDFSRefer()
4413 pSMB->MaxReferralLevel = cpu_to_le16(3); in CIFSGetDFSRefer()
4415 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSGetDFSRefer()
4426 if (rc || get_bcc(&pSMBr->hdr) < 17) { in CIFSGetDFSRefer()
4427 rc = -EIO; /* bad smb */ in CIFSGetDFSRefer()
4432 get_bcc(&pSMBr->hdr), le16_to_cpu(pSMBr->t2.DataOffset)); in CIFSGetDFSRefer()
4435 rc = parse_dfs_referrals(&pSMBr->dfs_data, in CIFSGetDFSRefer()
4436 le16_to_cpu(pSMBr->t2.DataCount), in CIFSGetDFSRefer()
4439 (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) != 0); in CIFSGetDFSRefer()
4444 if (rc == -EAGAIN) in CIFSGetDFSRefer()
4471 pSMB->TotalDataCount = 0; in SMBOldQFSInfo()
4472 pSMB->MaxParameterCount = cpu_to_le16(2); in SMBOldQFSInfo()
4473 pSMB->MaxDataCount = cpu_to_le16(1000); in SMBOldQFSInfo()
4474 pSMB->MaxSetupCount = 0; in SMBOldQFSInfo()
4475 pSMB->Reserved = 0; in SMBOldQFSInfo()
4476 pSMB->Flags = 0; in SMBOldQFSInfo()
4477 pSMB->Timeout = 0; in SMBOldQFSInfo()
4478 pSMB->Reserved2 = 0; in SMBOldQFSInfo()
4480 pSMB->TotalParameterCount = cpu_to_le16(params); in SMBOldQFSInfo()
4481 pSMB->ParameterCount = pSMB->TotalParameterCount; in SMBOldQFSInfo()
4482 pSMB->ParameterOffset = cpu_to_le16(offsetof( in SMBOldQFSInfo()
4483 struct smb_com_transaction2_qfsi_req, InformationLevel) - 4); in SMBOldQFSInfo()
4484 pSMB->DataCount = 0; in SMBOldQFSInfo()
4485 pSMB->DataOffset = 0; in SMBOldQFSInfo()
4486 pSMB->SetupCount = 1; in SMBOldQFSInfo()
4487 pSMB->Reserved3 = 0; in SMBOldQFSInfo()
4488 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in SMBOldQFSInfo()
4489 pSMB->InformationLevel = cpu_to_le16(SMB_INFO_ALLOCATION); in SMBOldQFSInfo()
4491 pSMB->ByteCount = cpu_to_le16(byte_count); in SMBOldQFSInfo()
4493 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in SMBOldQFSInfo()
4500 if (rc || get_bcc(&pSMBr->hdr) < 18) in SMBOldQFSInfo()
4501 rc = -EIO; /* bad smb */ in SMBOldQFSInfo()
4503 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in SMBOldQFSInfo()
4505 get_bcc(&pSMBr->hdr), data_offset); in SMBOldQFSInfo()
4508 (((char *) &pSMBr->hdr.Protocol) + data_offset); in SMBOldQFSInfo()
4509 FSData->f_bsize = in SMBOldQFSInfo()
4510 le16_to_cpu(response_data->BytesPerSector) * in SMBOldQFSInfo()
4511 le32_to_cpu(response_data-> in SMBOldQFSInfo()
4517 if (FSData->f_bsize < 512) in SMBOldQFSInfo()
4518 FSData->f_bsize = 4096; in SMBOldQFSInfo()
4520 FSData->f_blocks = in SMBOldQFSInfo()
4521 le32_to_cpu(response_data->TotalAllocationUnits); in SMBOldQFSInfo()
4522 FSData->f_bfree = FSData->f_bavail = in SMBOldQFSInfo()
4523 le32_to_cpu(response_data->FreeAllocationUnits); in SMBOldQFSInfo()
4525 (unsigned long long)FSData->f_blocks, in SMBOldQFSInfo()
4526 (unsigned long long)FSData->f_bfree, in SMBOldQFSInfo()
4527 FSData->f_bsize); in SMBOldQFSInfo()
4532 if (rc == -EAGAIN) in SMBOldQFSInfo()
4558 pSMB->TotalDataCount = 0; in CIFSSMBQFSInfo()
4559 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSInfo()
4560 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBQFSInfo()
4561 pSMB->MaxSetupCount = 0; in CIFSSMBQFSInfo()
4562 pSMB->Reserved = 0; in CIFSSMBQFSInfo()
4563 pSMB->Flags = 0; in CIFSSMBQFSInfo()
4564 pSMB->Timeout = 0; in CIFSSMBQFSInfo()
4565 pSMB->Reserved2 = 0; in CIFSSMBQFSInfo()
4567 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQFSInfo()
4568 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQFSInfo()
4569 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQFSInfo()
4570 struct smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSInfo()
4571 pSMB->DataCount = 0; in CIFSSMBQFSInfo()
4572 pSMB->DataOffset = 0; in CIFSSMBQFSInfo()
4573 pSMB->SetupCount = 1; in CIFSSMBQFSInfo()
4574 pSMB->Reserved3 = 0; in CIFSSMBQFSInfo()
4575 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSInfo()
4576 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FS_SIZE_INFO); in CIFSSMBQFSInfo()
4578 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSInfo()
4580 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSInfo()
4587 if (rc || get_bcc(&pSMBr->hdr) < 24) in CIFSSMBQFSInfo()
4588 rc = -EIO; /* bad smb */ in CIFSSMBQFSInfo()
4590 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSInfo()
4594 *) (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSInfo()
4596 FSData->f_bsize = in CIFSSMBQFSInfo()
4597 le32_to_cpu(response_data->BytesPerSector) * in CIFSSMBQFSInfo()
4598 le32_to_cpu(response_data-> in CIFSSMBQFSInfo()
4604 if (FSData->f_bsize < 512) in CIFSSMBQFSInfo()
4605 FSData->f_bsize = 4096; in CIFSSMBQFSInfo()
4607 FSData->f_blocks = in CIFSSMBQFSInfo()
4608 le64_to_cpu(response_data->TotalAllocationUnits); in CIFSSMBQFSInfo()
4609 FSData->f_bfree = FSData->f_bavail = in CIFSSMBQFSInfo()
4610 le64_to_cpu(response_data->FreeAllocationUnits); in CIFSSMBQFSInfo()
4612 (unsigned long long)FSData->f_blocks, in CIFSSMBQFSInfo()
4613 (unsigned long long)FSData->f_bfree, in CIFSSMBQFSInfo()
4614 FSData->f_bsize); in CIFSSMBQFSInfo()
4619 if (rc == -EAGAIN) in CIFSSMBQFSInfo()
4644 pSMB->TotalDataCount = 0; in CIFSSMBQFSAttributeInfo()
4645 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSAttributeInfo()
4647 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBQFSAttributeInfo()
4648 pSMB->MaxSetupCount = 0; in CIFSSMBQFSAttributeInfo()
4649 pSMB->Reserved = 0; in CIFSSMBQFSAttributeInfo()
4650 pSMB->Flags = 0; in CIFSSMBQFSAttributeInfo()
4651 pSMB->Timeout = 0; in CIFSSMBQFSAttributeInfo()
4652 pSMB->Reserved2 = 0; in CIFSSMBQFSAttributeInfo()
4654 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQFSAttributeInfo()
4655 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQFSAttributeInfo()
4656 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQFSAttributeInfo()
4657 struct smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSAttributeInfo()
4658 pSMB->DataCount = 0; in CIFSSMBQFSAttributeInfo()
4659 pSMB->DataOffset = 0; in CIFSSMBQFSAttributeInfo()
4660 pSMB->SetupCount = 1; in CIFSSMBQFSAttributeInfo()
4661 pSMB->Reserved3 = 0; in CIFSSMBQFSAttributeInfo()
4662 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSAttributeInfo()
4663 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FS_ATTRIBUTE_INFO); in CIFSSMBQFSAttributeInfo()
4665 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSAttributeInfo()
4667 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSAttributeInfo()
4674 if (rc || get_bcc(&pSMBr->hdr) < 13) { in CIFSSMBQFSAttributeInfo()
4676 rc = -EIO; /* bad smb */ in CIFSSMBQFSAttributeInfo()
4678 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSAttributeInfo()
4681 *) (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSAttributeInfo()
4683 memcpy(&tcon->fsAttrInfo, response_data, in CIFSSMBQFSAttributeInfo()
4689 if (rc == -EAGAIN) in CIFSSMBQFSAttributeInfo()
4714 pSMB->TotalDataCount = 0; in CIFSSMBQFSDeviceInfo()
4715 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSDeviceInfo()
4717 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBQFSDeviceInfo()
4718 pSMB->MaxSetupCount = 0; in CIFSSMBQFSDeviceInfo()
4719 pSMB->Reserved = 0; in CIFSSMBQFSDeviceInfo()
4720 pSMB->Flags = 0; in CIFSSMBQFSDeviceInfo()
4721 pSMB->Timeout = 0; in CIFSSMBQFSDeviceInfo()
4722 pSMB->Reserved2 = 0; in CIFSSMBQFSDeviceInfo()
4724 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQFSDeviceInfo()
4725 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQFSDeviceInfo()
4726 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQFSDeviceInfo()
4727 struct smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSDeviceInfo()
4729 pSMB->DataCount = 0; in CIFSSMBQFSDeviceInfo()
4730 pSMB->DataOffset = 0; in CIFSSMBQFSDeviceInfo()
4731 pSMB->SetupCount = 1; in CIFSSMBQFSDeviceInfo()
4732 pSMB->Reserved3 = 0; in CIFSSMBQFSDeviceInfo()
4733 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSDeviceInfo()
4734 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FS_DEVICE_INFO); in CIFSSMBQFSDeviceInfo()
4736 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSDeviceInfo()
4738 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSDeviceInfo()
4745 if (rc || get_bcc(&pSMBr->hdr) < in CIFSSMBQFSDeviceInfo()
4747 rc = -EIO; /* bad smb */ in CIFSSMBQFSDeviceInfo()
4749 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSDeviceInfo()
4752 (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSDeviceInfo()
4754 memcpy(&tcon->fsDevInfo, response_data, in CIFSSMBQFSDeviceInfo()
4760 if (rc == -EAGAIN) in CIFSSMBQFSDeviceInfo()
4785 pSMB->TotalDataCount = 0; in CIFSSMBQFSUnixInfo()
4786 pSMB->DataCount = 0; in CIFSSMBQFSUnixInfo()
4787 pSMB->DataOffset = 0; in CIFSSMBQFSUnixInfo()
4788 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSUnixInfo()
4790 pSMB->MaxDataCount = cpu_to_le16(100); in CIFSSMBQFSUnixInfo()
4791 pSMB->MaxSetupCount = 0; in CIFSSMBQFSUnixInfo()
4792 pSMB->Reserved = 0; in CIFSSMBQFSUnixInfo()
4793 pSMB->Flags = 0; in CIFSSMBQFSUnixInfo()
4794 pSMB->Timeout = 0; in CIFSSMBQFSUnixInfo()
4795 pSMB->Reserved2 = 0; in CIFSSMBQFSUnixInfo()
4797 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBQFSUnixInfo()
4798 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBQFSUnixInfo()
4799 pSMB->ParameterOffset = cpu_to_le16(offsetof(struct in CIFSSMBQFSUnixInfo()
4800 smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSUnixInfo()
4801 pSMB->SetupCount = 1; in CIFSSMBQFSUnixInfo()
4802 pSMB->Reserved3 = 0; in CIFSSMBQFSUnixInfo()
4803 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSUnixInfo()
4804 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_CIFS_UNIX_INFO); in CIFSSMBQFSUnixInfo()
4806 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSUnixInfo()
4808 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSUnixInfo()
4815 if (rc || get_bcc(&pSMBr->hdr) < 13) { in CIFSSMBQFSUnixInfo()
4816 rc = -EIO; /* bad smb */ in CIFSSMBQFSUnixInfo()
4818 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSUnixInfo()
4821 *) (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSUnixInfo()
4823 memcpy(&tcon->fsUnixInfo, response_data, in CIFSSMBQFSUnixInfo()
4829 if (rc == -EAGAIN) in CIFSSMBQFSUnixInfo()
4855 pSMB->MaxSetupCount = 0; in CIFSSMBSetFSUnixInfo()
4856 pSMB->Reserved = 0; in CIFSSMBSetFSUnixInfo()
4857 pSMB->Flags = 0; in CIFSSMBSetFSUnixInfo()
4858 pSMB->Timeout = 0; in CIFSSMBSetFSUnixInfo()
4859 pSMB->Reserved2 = 0; in CIFSSMBSetFSUnixInfo()
4861 - 4; in CIFSSMBSetFSUnixInfo()
4864 pSMB->MaxParameterCount = cpu_to_le16(4); in CIFSSMBSetFSUnixInfo()
4866 pSMB->MaxDataCount = cpu_to_le16(100); in CIFSSMBSetFSUnixInfo()
4867 pSMB->SetupCount = 1; in CIFSSMBSetFSUnixInfo()
4868 pSMB->Reserved3 = 0; in CIFSSMBSetFSUnixInfo()
4869 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FS_INFORMATION); in CIFSSMBSetFSUnixInfo()
4872 pSMB->DataCount = cpu_to_le16(12); in CIFSSMBSetFSUnixInfo()
4873 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetFSUnixInfo()
4874 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetFSUnixInfo()
4875 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetFSUnixInfo()
4876 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetFSUnixInfo()
4877 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetFSUnixInfo()
4880 pSMB->FileNum = 0; in CIFSSMBSetFSUnixInfo()
4881 pSMB->InformationLevel = cpu_to_le16(SMB_SET_CIFS_UNIX_INFO); in CIFSSMBSetFSUnixInfo()
4884 pSMB->ClientUnixMajor = cpu_to_le16(CIFS_UNIX_MAJOR_VERSION); in CIFSSMBSetFSUnixInfo()
4885 pSMB->ClientUnixMinor = cpu_to_le16(CIFS_UNIX_MINOR_VERSION); in CIFSSMBSetFSUnixInfo()
4886 pSMB->ClientUnixCap = cpu_to_le64(cap); in CIFSSMBSetFSUnixInfo()
4889 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetFSUnixInfo()
4891 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetFSUnixInfo()
4898 rc = -EIO; /* bad smb */ in CIFSSMBSetFSUnixInfo()
4902 if (rc == -EAGAIN) in CIFSSMBSetFSUnixInfo()
4930 pSMB->TotalDataCount = 0; in CIFSSMBQFSPosixInfo()
4931 pSMB->DataCount = 0; in CIFSSMBQFSPosixInfo()
4932 pSMB->DataOffset = 0; in CIFSSMBQFSPosixInfo()
4933 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSPosixInfo()
4935 pSMB->MaxDataCount = cpu_to_le16(100); in CIFSSMBQFSPosixInfo()
4936 pSMB->MaxSetupCount = 0; in CIFSSMBQFSPosixInfo()
4937 pSMB->Reserved = 0; in CIFSSMBQFSPosixInfo()
4938 pSMB->Flags = 0; in CIFSSMBQFSPosixInfo()
4939 pSMB->Timeout = 0; in CIFSSMBQFSPosixInfo()
4940 pSMB->Reserved2 = 0; in CIFSSMBQFSPosixInfo()
4942 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBQFSPosixInfo()
4943 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBQFSPosixInfo()
4944 pSMB->ParameterOffset = cpu_to_le16(offsetof(struct in CIFSSMBQFSPosixInfo()
4945 smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSPosixInfo()
4946 pSMB->SetupCount = 1; in CIFSSMBQFSPosixInfo()
4947 pSMB->Reserved3 = 0; in CIFSSMBQFSPosixInfo()
4948 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSPosixInfo()
4949 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_POSIX_FS_INFO); in CIFSSMBQFSPosixInfo()
4951 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSPosixInfo()
4953 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSPosixInfo()
4960 if (rc || get_bcc(&pSMBr->hdr) < 13) { in CIFSSMBQFSPosixInfo()
4961 rc = -EIO; /* bad smb */ in CIFSSMBQFSPosixInfo()
4963 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSPosixInfo()
4966 *) (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSPosixInfo()
4968 FSData->f_bsize = in CIFSSMBQFSPosixInfo()
4969 le32_to_cpu(response_data->BlockSize); in CIFSSMBQFSPosixInfo()
4974 if (FSData->f_bsize < 512) in CIFSSMBQFSPosixInfo()
4975 FSData->f_bsize = 4096; in CIFSSMBQFSPosixInfo()
4977 FSData->f_blocks = in CIFSSMBQFSPosixInfo()
4978 le64_to_cpu(response_data->TotalBlocks); in CIFSSMBQFSPosixInfo()
4979 FSData->f_bfree = in CIFSSMBQFSPosixInfo()
4980 le64_to_cpu(response_data->BlocksAvail); in CIFSSMBQFSPosixInfo()
4981 if (response_data->UserBlocksAvail == cpu_to_le64(-1)) { in CIFSSMBQFSPosixInfo()
4982 FSData->f_bavail = FSData->f_bfree; in CIFSSMBQFSPosixInfo()
4984 FSData->f_bavail = in CIFSSMBQFSPosixInfo()
4985 le64_to_cpu(response_data->UserBlocksAvail); in CIFSSMBQFSPosixInfo()
4987 if (response_data->TotalFileNodes != cpu_to_le64(-1)) in CIFSSMBQFSPosixInfo()
4988 FSData->f_files = in CIFSSMBQFSPosixInfo()
4989 le64_to_cpu(response_data->TotalFileNodes); in CIFSSMBQFSPosixInfo()
4990 if (response_data->FreeFileNodes != cpu_to_le64(-1)) in CIFSSMBQFSPosixInfo()
4991 FSData->f_ffree = in CIFSSMBQFSPosixInfo()
4992 le64_to_cpu(response_data->FreeFileNodes); in CIFSSMBQFSPosixInfo()
4997 if (rc == -EAGAIN) in CIFSSMBQFSPosixInfo()
5005 * We can not use write of zero bytes trick to set file size due to need for
5032 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBSetEOF()
5034 cifsConvertToUTF16((__le16 *) pSMB->FileName, file_name, in CIFSSMBSetEOF()
5035 PATH_MAX, cifs_sb->local_nls, remap); in CIFSSMBSetEOF()
5039 name_len = copy_path_name(pSMB->FileName, file_name); in CIFSSMBSetEOF()
5043 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetEOF()
5044 pSMB->MaxDataCount = cpu_to_le16(4100); in CIFSSMBSetEOF()
5045 pSMB->MaxSetupCount = 0; in CIFSSMBSetEOF()
5046 pSMB->Reserved = 0; in CIFSSMBSetEOF()
5047 pSMB->Flags = 0; in CIFSSMBSetEOF()
5048 pSMB->Timeout = 0; in CIFSSMBSetEOF()
5049 pSMB->Reserved2 = 0; in CIFSSMBSetEOF()
5051 InformationLevel) - 4; in CIFSSMBSetEOF()
5054 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetEOF()
5055 pSMB->InformationLevel = in CIFSSMBSetEOF()
5058 pSMB->InformationLevel = in CIFSSMBSetEOF()
5060 } else /* Set File Size */ { in CIFSSMBSetEOF()
5061 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetEOF()
5062 pSMB->InformationLevel = in CIFSSMBSetEOF()
5065 pSMB->InformationLevel = in CIFSSMBSetEOF()
5070 (struct file_end_of_file_info *) (((char *) &pSMB->hdr.Protocol) + in CIFSSMBSetEOF()
5072 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetEOF()
5073 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetEOF()
5074 pSMB->SetupCount = 1; in CIFSSMBSetEOF()
5075 pSMB->Reserved3 = 0; in CIFSSMBSetEOF()
5076 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSSMBSetEOF()
5078 pSMB->DataCount = cpu_to_le16(data_count); in CIFSSMBSetEOF()
5079 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetEOF()
5080 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetEOF()
5081 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetEOF()
5082 pSMB->Reserved4 = 0; in CIFSSMBSetEOF()
5084 parm_data->FileSize = cpu_to_le64(size); in CIFSSMBSetEOF()
5085 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetEOF()
5086 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetEOF()
5093 if (rc == -EAGAIN) in CIFSSMBSetEOF()
5115 pSMB->hdr.Pid = cpu_to_le16((__u16)cfile->pid); in CIFSSMBSetFileSize()
5116 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(cfile->pid >> 16)); in CIFSSMBSetFileSize()
5119 pSMB->MaxSetupCount = 0; in CIFSSMBSetFileSize()
5120 pSMB->Reserved = 0; in CIFSSMBSetFileSize()
5121 pSMB->Flags = 0; in CIFSSMBSetFileSize()
5122 pSMB->Timeout = 0; in CIFSSMBSetFileSize()
5123 pSMB->Reserved2 = 0; in CIFSSMBSetFileSize()
5124 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBSetFileSize()
5128 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetFileSize()
5130 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetFileSize()
5131 pSMB->SetupCount = 1; in CIFSSMBSetFileSize()
5132 pSMB->Reserved3 = 0; in CIFSSMBSetFileSize()
5133 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBSetFileSize()
5135 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetFileSize()
5136 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetFileSize()
5137 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetFileSize()
5138 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetFileSize()
5139 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetFileSize()
5143 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetFileSize()
5144 parm_data->FileSize = cpu_to_le64(size); in CIFSSMBSetFileSize()
5145 pSMB->Fid = cfile->fid.netfid; in CIFSSMBSetFileSize()
5147 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetFileSize()
5148 pSMB->InformationLevel = in CIFSSMBSetFileSize()
5151 pSMB->InformationLevel = in CIFSSMBSetFileSize()
5153 } else /* Set File Size */ { in CIFSSMBSetFileSize()
5154 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetFileSize()
5155 pSMB->InformationLevel = in CIFSSMBSetFileSize()
5158 pSMB->InformationLevel = in CIFSSMBSetFileSize()
5161 pSMB->Reserved4 = 0; in CIFSSMBSetFileSize()
5163 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetFileSize()
5164 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBSetFileSize()
5171 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBSetFileSize()
5198 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in SMBSetInformation()
5200 cifsConvertToUTF16((__le16 *) pSMB->fileName, in SMBSetInformation()
5206 name_len = copy_path_name(pSMB->fileName, fileName); in SMBSetInformation()
5208 /* Only few attributes can be set by this command, others are not accepted by Win9x. */ in SMBSetInformation()
5209 pSMB->attr = cpu_to_le16(le32_to_cpu(attributes) & in SMBSetInformation()
5214 pSMB->last_write_time = cpu_to_le32(ts.tv_sec); in SMBSetInformation()
5216 pSMB->BufferFormat = 0x04; in SMBSetInformation()
5219 pSMB->ByteCount = cpu_to_le16(name_len); in SMBSetInformation()
5221 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in SMBSetInformation()
5228 if (rc == -EAGAIN) in SMBSetInformation()
5234 /* Some legacy servers such as NT4 require that the file times be set on
5235 an open handle, rather than by pathname - this is awkward due to
5249 cifs_dbg(FYI, "Set Times (via SetFileInfo)\n"); in CIFSSMBSetFileInfo()
5255 pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener); in CIFSSMBSetFileInfo()
5256 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16)); in CIFSSMBSetFileInfo()
5259 pSMB->MaxSetupCount = 0; in CIFSSMBSetFileInfo()
5260 pSMB->Reserved = 0; in CIFSSMBSetFileInfo()
5261 pSMB->Flags = 0; in CIFSSMBSetFileInfo()
5262 pSMB->Timeout = 0; in CIFSSMBSetFileInfo()
5263 pSMB->Reserved2 = 0; in CIFSSMBSetFileInfo()
5264 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBSetFileInfo()
5271 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetFileInfo()
5273 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetFileInfo()
5274 pSMB->SetupCount = 1; in CIFSSMBSetFileInfo()
5275 pSMB->Reserved3 = 0; in CIFSSMBSetFileInfo()
5276 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBSetFileInfo()
5278 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetFileInfo()
5279 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetFileInfo()
5280 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetFileInfo()
5281 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetFileInfo()
5282 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetFileInfo()
5283 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetFileInfo()
5284 pSMB->Fid = fid; in CIFSSMBSetFileInfo()
5285 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetFileInfo()
5286 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_BASIC_INFO2); in CIFSSMBSetFileInfo()
5288 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_BASIC_INFO); in CIFSSMBSetFileInfo()
5289 pSMB->Reserved4 = 0; in CIFSSMBSetFileInfo()
5291 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetFileInfo()
5293 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBSetFileInfo()
5296 cifs_dbg(FYI, "Send error in Set Time (SetFileInfo) = %d\n", in CIFSSMBSetFileInfo()
5299 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBSetFileInfo()
5314 cifs_dbg(FYI, "Set File Disposition (via SetFileInfo)\n"); in CIFSSMBSetFileDisposition()
5320 pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener); in CIFSSMBSetFileDisposition()
5321 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16)); in CIFSSMBSetFileDisposition()
5324 pSMB->MaxSetupCount = 0; in CIFSSMBSetFileDisposition()
5325 pSMB->Reserved = 0; in CIFSSMBSetFileDisposition()
5326 pSMB->Flags = 0; in CIFSSMBSetFileDisposition()
5327 pSMB->Timeout = 0; in CIFSSMBSetFileDisposition()
5328 pSMB->Reserved2 = 0; in CIFSSMBSetFileDisposition()
5329 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBSetFileDisposition()
5336 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetFileDisposition()
5338 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetFileDisposition()
5339 pSMB->SetupCount = 1; in CIFSSMBSetFileDisposition()
5340 pSMB->Reserved3 = 0; in CIFSSMBSetFileDisposition()
5341 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBSetFileDisposition()
5343 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetFileDisposition()
5344 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetFileDisposition()
5345 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetFileDisposition()
5346 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetFileDisposition()
5347 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetFileDisposition()
5348 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetFileDisposition()
5349 pSMB->Fid = fid; in CIFSSMBSetFileDisposition()
5350 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_DISPOSITION_INFO); in CIFSSMBSetFileDisposition()
5351 pSMB->Reserved4 = 0; in CIFSSMBSetFileDisposition()
5353 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetFileDisposition()
5355 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBSetFileDisposition()
5388 rc = CIFSSMBSetFileInfo(xid, tcon, data, fid.netfid, current->tgid); in CIFSSMBSetPathInfoFB()
5418 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBSetPathInfo()
5420 cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, in CIFSSMBSetPathInfo()
5425 name_len = copy_path_name(pSMB->FileName, fileName); in CIFSSMBSetPathInfo()
5430 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetPathInfo()
5432 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetPathInfo()
5433 pSMB->MaxSetupCount = 0; in CIFSSMBSetPathInfo()
5434 pSMB->Reserved = 0; in CIFSSMBSetPathInfo()
5435 pSMB->Flags = 0; in CIFSSMBSetPathInfo()
5436 pSMB->Timeout = 0; in CIFSSMBSetPathInfo()
5437 pSMB->Reserved2 = 0; in CIFSSMBSetPathInfo()
5439 InformationLevel) - 4; in CIFSSMBSetPathInfo()
5442 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetPathInfo()
5443 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetPathInfo()
5444 pSMB->SetupCount = 1; in CIFSSMBSetPathInfo()
5445 pSMB->Reserved3 = 0; in CIFSSMBSetPathInfo()
5446 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSSMBSetPathInfo()
5449 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetPathInfo()
5450 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetPathInfo()
5451 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetPathInfo()
5452 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetPathInfo()
5453 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetPathInfo()
5454 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_BASIC_INFO2); in CIFSSMBSetPathInfo()
5456 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_BASIC_INFO); in CIFSSMBSetPathInfo()
5457 pSMB->Reserved4 = 0; in CIFSSMBSetPathInfo()
5460 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetPathInfo()
5461 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetPathInfo()
5468 if (rc == -EAGAIN) in CIFSSMBSetPathInfo()
5471 if (rc == -EOPNOTSUPP) in CIFSSMBSetPathInfo()
5483 u64 mode = args->mode; in cifs_fill_unix_set_info()
5485 if (uid_valid(args->uid)) in cifs_fill_unix_set_info()
5486 uid = from_kuid(&init_user_ns, args->uid); in cifs_fill_unix_set_info()
5487 if (gid_valid(args->gid)) in cifs_fill_unix_set_info()
5488 gid = from_kgid(&init_user_ns, args->gid); in cifs_fill_unix_set_info()
5491 * Samba server ignores set of file size to zero due to bugs in some in cifs_fill_unix_set_info()
5492 * older clients, but we should be precise - we use SetFileSize to in cifs_fill_unix_set_info()
5493 * set file size and do not want to truncate file size to zero in cifs_fill_unix_set_info()
5495 * zero instead of -1 here in cifs_fill_unix_set_info()
5497 data_offset->EndOfFile = cpu_to_le64(NO_CHANGE_64); in cifs_fill_unix_set_info()
5498 data_offset->NumOfBytes = cpu_to_le64(NO_CHANGE_64); in cifs_fill_unix_set_info()
5499 data_offset->LastStatusChange = cpu_to_le64(args->ctime); in cifs_fill_unix_set_info()
5500 data_offset->LastAccessTime = cpu_to_le64(args->atime); in cifs_fill_unix_set_info()
5501 data_offset->LastModificationTime = cpu_to_le64(args->mtime); in cifs_fill_unix_set_info()
5502 data_offset->Uid = cpu_to_le64(uid); in cifs_fill_unix_set_info()
5503 data_offset->Gid = cpu_to_le64(gid); in cifs_fill_unix_set_info()
5505 data_offset->DevMajor = cpu_to_le64(MAJOR(args->device)); in cifs_fill_unix_set_info()
5506 data_offset->DevMinor = cpu_to_le64(MINOR(args->device)); in cifs_fill_unix_set_info()
5507 data_offset->Permissions = cpu_to_le64(mode); in cifs_fill_unix_set_info()
5510 data_offset->Type = cpu_to_le32(UNIX_FILE); in cifs_fill_unix_set_info()
5512 data_offset->Type = cpu_to_le32(UNIX_DIR); in cifs_fill_unix_set_info()
5514 data_offset->Type = cpu_to_le32(UNIX_SYMLINK); in cifs_fill_unix_set_info()
5516 data_offset->Type = cpu_to_le32(UNIX_CHARDEV); in cifs_fill_unix_set_info()
5518 data_offset->Type = cpu_to_le32(UNIX_BLOCKDEV); in cifs_fill_unix_set_info()
5520 data_offset->Type = cpu_to_le32(UNIX_FIFO); in cifs_fill_unix_set_info()
5522 data_offset->Type = cpu_to_le32(UNIX_SOCKET); in cifs_fill_unix_set_info()
5535 cifs_dbg(FYI, "Set Unix Info (via SetFileInfo)\n"); in CIFSSMBUnixSetFileInfo()
5541 pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener); in CIFSSMBUnixSetFileInfo()
5542 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16)); in CIFSSMBUnixSetFileInfo()
5545 pSMB->MaxSetupCount = 0; in CIFSSMBUnixSetFileInfo()
5546 pSMB->Reserved = 0; in CIFSSMBUnixSetFileInfo()
5547 pSMB->Flags = 0; in CIFSSMBUnixSetFileInfo()
5548 pSMB->Timeout = 0; in CIFSSMBUnixSetFileInfo()
5549 pSMB->Reserved2 = 0; in CIFSSMBUnixSetFileInfo()
5550 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBUnixSetFileInfo()
5558 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBUnixSetFileInfo()
5560 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBUnixSetFileInfo()
5561 pSMB->SetupCount = 1; in CIFSSMBUnixSetFileInfo()
5562 pSMB->Reserved3 = 0; in CIFSSMBUnixSetFileInfo()
5563 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBUnixSetFileInfo()
5565 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBUnixSetFileInfo()
5566 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBUnixSetFileInfo()
5567 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBUnixSetFileInfo()
5568 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBUnixSetFileInfo()
5569 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBUnixSetFileInfo()
5570 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBUnixSetFileInfo()
5571 pSMB->Fid = fid; in CIFSSMBUnixSetFileInfo()
5572 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_UNIX_BASIC); in CIFSSMBUnixSetFileInfo()
5573 pSMB->Reserved4 = 0; in CIFSSMBUnixSetFileInfo()
5575 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixSetFileInfo()
5579 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBUnixSetFileInfo()
5582 cifs_dbg(FYI, "Send error in Set Time (SetFileInfo) = %d\n", in CIFSSMBUnixSetFileInfo()
5585 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBUnixSetFileInfo()
5612 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBUnixSetPathInfo()
5614 cifsConvertToUTF16((__le16 *) pSMB->FileName, file_name, in CIFSSMBUnixSetPathInfo()
5619 name_len = copy_path_name(pSMB->FileName, file_name); in CIFSSMBUnixSetPathInfo()
5624 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBUnixSetPathInfo()
5626 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBUnixSetPathInfo()
5627 pSMB->MaxSetupCount = 0; in CIFSSMBUnixSetPathInfo()
5628 pSMB->Reserved = 0; in CIFSSMBUnixSetPathInfo()
5629 pSMB->Flags = 0; in CIFSSMBUnixSetPathInfo()
5630 pSMB->Timeout = 0; in CIFSSMBUnixSetPathInfo()
5631 pSMB->Reserved2 = 0; in CIFSSMBUnixSetPathInfo()
5633 InformationLevel) - 4; in CIFSSMBUnixSetPathInfo()
5638 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBUnixSetPathInfo()
5639 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBUnixSetPathInfo()
5640 pSMB->SetupCount = 1; in CIFSSMBUnixSetPathInfo()
5641 pSMB->Reserved3 = 0; in CIFSSMBUnixSetPathInfo()
5642 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSSMBUnixSetPathInfo()
5644 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBUnixSetPathInfo()
5645 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBUnixSetPathInfo()
5646 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBUnixSetPathInfo()
5647 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBUnixSetPathInfo()
5648 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_UNIX_BASIC); in CIFSSMBUnixSetPathInfo()
5649 pSMB->Reserved4 = 0; in CIFSSMBUnixSetPathInfo()
5654 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixSetPathInfo()
5655 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBUnixSetPathInfo()
5661 if (rc == -EAGAIN) in CIFSSMBUnixSetPathInfo()
5668 * Do a path-based QUERY_ALL_EAS call and parse the result. This is a common
5669 * function used by listxattr and getxattr type calls. When ea_name is set,
5686 struct nls_table *nls_codepage = cifs_sb->local_nls; in CIFSSMBQAllEAs()
5704 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBQAllEAs()
5706 cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, in CIFSSMBQAllEAs()
5711 list_len = copy_path_name(pSMB->FileName, searchName); in CIFSSMBQAllEAs()
5715 pSMB->TotalDataCount = 0; in CIFSSMBQAllEAs()
5716 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQAllEAs()
5718 pSMB->MaxDataCount = cpu_to_le16(CIFSMaxBufSize); in CIFSSMBQAllEAs()
5719 pSMB->MaxSetupCount = 0; in CIFSSMBQAllEAs()
5720 pSMB->Reserved = 0; in CIFSSMBQAllEAs()
5721 pSMB->Flags = 0; in CIFSSMBQAllEAs()
5722 pSMB->Timeout = 0; in CIFSSMBQAllEAs()
5723 pSMB->Reserved2 = 0; in CIFSSMBQAllEAs()
5724 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQAllEAs()
5725 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSSMBQAllEAs()
5726 pSMB->DataCount = 0; in CIFSSMBQAllEAs()
5727 pSMB->DataOffset = 0; in CIFSSMBQAllEAs()
5728 pSMB->SetupCount = 1; in CIFSSMBQAllEAs()
5729 pSMB->Reserved3 = 0; in CIFSSMBQAllEAs()
5730 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSSMBQAllEAs()
5732 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQAllEAs()
5733 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQAllEAs()
5734 pSMB->InformationLevel = cpu_to_le16(SMB_INFO_QUERY_ALL_EAS); in CIFSSMBQAllEAs()
5735 pSMB->Reserved4 = 0; in CIFSSMBQAllEAs()
5737 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQAllEAs()
5739 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQAllEAs()
5752 if (rc || get_bcc(&pSMBr->hdr) < 4) { in CIFSSMBQAllEAs()
5753 rc = -EIO; /* bad smb */ in CIFSSMBQAllEAs()
5765 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQAllEAs()
5767 (((char *) &pSMBr->hdr.Protocol) + data_offset); in CIFSSMBQAllEAs()
5769 list_len = le32_to_cpu(ea_response_data->list_len); in CIFSSMBQAllEAs()
5775 rc = -ENODATA; in CIFSSMBQAllEAs()
5780 end_of_smb = (char *)pByteArea(&pSMBr->hdr) + get_bcc(&pSMBr->hdr); in CIFSSMBQAllEAs()
5783 rc = -EIO; in CIFSSMBQAllEAs()
5788 list_len -= 4; in CIFSSMBQAllEAs()
5789 temp_fea = &ea_response_data->list; in CIFSSMBQAllEAs()
5795 list_len -= 4; in CIFSSMBQAllEAs()
5800 rc = -EIO; in CIFSSMBQAllEAs()
5804 name_len = temp_fea->name_len; in CIFSSMBQAllEAs()
5805 value_len = le16_to_cpu(temp_fea->value_len); in CIFSSMBQAllEAs()
5806 list_len -= name_len + 1 + value_len; in CIFSSMBQAllEAs()
5809 rc = -EIO; in CIFSSMBQAllEAs()
5821 rc = -ERANGE; in CIFSSMBQAllEAs()
5839 /* skip copy - calc size only */ in CIFSSMBQAllEAs()
5842 rc = -ERANGE; in CIFSSMBQAllEAs()
5852 rc = -ENODATA; in CIFSSMBQAllEAs()
5856 if (rc == -EAGAIN) in CIFSSMBQAllEAs()
5884 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBSetEA()
5886 cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, in CIFSSMBSetEA()
5891 name_len = copy_path_name(pSMB->FileName, fileName); in CIFSSMBSetEA()
5905 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetEA()
5907 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetEA()
5908 pSMB->MaxSetupCount = 0; in CIFSSMBSetEA()
5909 pSMB->Reserved = 0; in CIFSSMBSetEA()
5910 pSMB->Flags = 0; in CIFSSMBSetEA()
5911 pSMB->Timeout = 0; in CIFSSMBSetEA()
5912 pSMB->Reserved2 = 0; in CIFSSMBSetEA()
5914 InformationLevel) - 4; in CIFSSMBSetEA()
5916 pSMB->InformationLevel = in CIFSSMBSetEA()
5920 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetEA()
5921 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetEA()
5922 pSMB->SetupCount = 1; in CIFSSMBSetEA()
5923 pSMB->Reserved3 = 0; in CIFSSMBSetEA()
5924 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSSMBSetEA()
5926 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetEA()
5927 parm_data->list_len = cpu_to_le32(count); in CIFSSMBSetEA()
5928 parm_data->list.EA_flags = 0; in CIFSSMBSetEA()
5930 parm_data->list.name_len = (__u8)name_len; in CIFSSMBSetEA()
5933 strncpy(parm_data->list.name, ea_name, name_len); in CIFSSMBSetEA()
5934 parm_data->list.name[name_len] = '\0'; in CIFSSMBSetEA()
5935 parm_data->list.value_len = cpu_to_le16(ea_value_len); in CIFSSMBSetEA()
5941 /* if (ea_value_len > buffer_size - 512 (enough for header)) */ in CIFSSMBSetEA()
5943 memcpy(parm_data->list.name + name_len + 1, in CIFSSMBSetEA()
5946 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetEA()
5947 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetEA()
5948 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetEA()
5949 pSMB->Reserved4 = 0; in CIFSSMBSetEA()
5951 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetEA()
5952 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetEA()
5959 if (rc == -EAGAIN) in CIFSSMBSetEA()