|
@@ -5115,6 +5115,69 @@ cifs_fill_unix_set_info(FILE_UNIX_BASIC_INFO *data_offset,
|
|
|
data_offset->Type = cpu_to_le32(UNIX_SOCKET);
|
|
|
}
|
|
|
|
|
|
+int
|
|
|
+CIFSSMBUnixSetFileInfo(const int xid, struct cifsTconInfo *tcon,
|
|
|
+ const struct cifs_unix_set_info_args *args,
|
|
|
+ u16 fid, u32 pid_of_opener)
|
|
|
+{
|
|
|
+ struct smb_com_transaction2_sfi_req *pSMB = NULL;
|
|
|
+ FILE_UNIX_BASIC_INFO *data_offset;
|
|
|
+ int rc = 0;
|
|
|
+ u16 params, param_offset, offset, byte_count, count;
|
|
|
+
|
|
|
+ cFYI(1, ("Set Unix Info (via SetFileInfo)"));
|
|
|
+ rc = small_smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB);
|
|
|
+
|
|
|
+ if (rc)
|
|
|
+ return rc;
|
|
|
+
|
|
|
+ pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener);
|
|
|
+ pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16));
|
|
|
+
|
|
|
+ params = 6;
|
|
|
+ pSMB->MaxSetupCount = 0;
|
|
|
+ pSMB->Reserved = 0;
|
|
|
+ pSMB->Flags = 0;
|
|
|
+ pSMB->Timeout = 0;
|
|
|
+ pSMB->Reserved2 = 0;
|
|
|
+ param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4;
|
|
|
+ offset = param_offset + params;
|
|
|
+
|
|
|
+ data_offset = (FILE_UNIX_BASIC_INFO *)
|
|
|
+ ((char *)(&pSMB->hdr.Protocol) + offset);
|
|
|
+ count = sizeof(FILE_UNIX_BASIC_INFO);
|
|
|
+
|
|
|
+ pSMB->MaxParameterCount = cpu_to_le16(2);
|
|
|
+ /* BB find max SMB PDU from sess */
|
|
|
+ pSMB->MaxDataCount = cpu_to_le16(1000);
|
|
|
+ pSMB->SetupCount = 1;
|
|
|
+ pSMB->Reserved3 = 0;
|
|
|
+ pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION);
|
|
|
+ byte_count = 3 /* pad */ + params + count;
|
|
|
+ pSMB->DataCount = cpu_to_le16(count);
|
|
|
+ pSMB->ParameterCount = cpu_to_le16(params);
|
|
|
+ pSMB->TotalDataCount = pSMB->DataCount;
|
|
|
+ pSMB->TotalParameterCount = pSMB->ParameterCount;
|
|
|
+ pSMB->ParameterOffset = cpu_to_le16(param_offset);
|
|
|
+ pSMB->DataOffset = cpu_to_le16(offset);
|
|
|
+ pSMB->Fid = fid;
|
|
|
+ pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_UNIX_BASIC);
|
|
|
+ pSMB->Reserved4 = 0;
|
|
|
+ pSMB->hdr.smb_buf_length += byte_count;
|
|
|
+ pSMB->ByteCount = cpu_to_le16(byte_count);
|
|
|
+
|
|
|
+ cifs_fill_unix_set_info(data_offset, args);
|
|
|
+
|
|
|
+ rc = SendReceiveNoRsp(xid, tcon->ses, (struct smb_hdr *) pSMB, 0);
|
|
|
+ if (rc)
|
|
|
+ cFYI(1, ("Send error in Set Time (SetFileInfo) = %d", rc));
|
|
|
+
|
|
|
+ /* Note: On -EAGAIN error only caller can retry on handle based calls
|
|
|
+ since file handle passed in no longer valid */
|
|
|
+
|
|
|
+ return rc;
|
|
|
+}
|
|
|
+
|
|
|
int
|
|
|
CIFSSMBUnixSetPathInfo(const int xid, struct cifsTconInfo *tcon, char *fileName,
|
|
|
const struct cifs_unix_set_info_args *args,
|