|
@@ -5074,6 +5074,47 @@ SetAttrLgcyRetry:
|
|
|
}
|
|
|
#endif /* temporarily unneeded SetAttr legacy function */
|
|
|
|
|
|
+static void
|
|
|
+cifs_fill_unix_set_info(FILE_UNIX_BASIC_INFO *data_offset,
|
|
|
+ const struct cifs_unix_set_info_args *args)
|
|
|
+{
|
|
|
+ u64 mode = args->mode;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Samba server ignores set of file size to zero due to bugs in some
|
|
|
+ * older clients, but we should be precise - we use SetFileSize to
|
|
|
+ * set file size and do not want to truncate file size to zero
|
|
|
+ * accidently as happened on one Samba server beta by putting
|
|
|
+ * zero instead of -1 here
|
|
|
+ */
|
|
|
+ data_offset->EndOfFile = cpu_to_le64(NO_CHANGE_64);
|
|
|
+ data_offset->NumOfBytes = cpu_to_le64(NO_CHANGE_64);
|
|
|
+ data_offset->LastStatusChange = cpu_to_le64(args->ctime);
|
|
|
+ data_offset->LastAccessTime = cpu_to_le64(args->atime);
|
|
|
+ data_offset->LastModificationTime = cpu_to_le64(args->mtime);
|
|
|
+ data_offset->Uid = cpu_to_le64(args->uid);
|
|
|
+ data_offset->Gid = cpu_to_le64(args->gid);
|
|
|
+ /* better to leave device as zero when it is */
|
|
|
+ data_offset->DevMajor = cpu_to_le64(MAJOR(args->device));
|
|
|
+ data_offset->DevMinor = cpu_to_le64(MINOR(args->device));
|
|
|
+ data_offset->Permissions = cpu_to_le64(mode);
|
|
|
+
|
|
|
+ if (S_ISREG(mode))
|
|
|
+ data_offset->Type = cpu_to_le32(UNIX_FILE);
|
|
|
+ else if (S_ISDIR(mode))
|
|
|
+ data_offset->Type = cpu_to_le32(UNIX_DIR);
|
|
|
+ else if (S_ISLNK(mode))
|
|
|
+ data_offset->Type = cpu_to_le32(UNIX_SYMLINK);
|
|
|
+ else if (S_ISCHR(mode))
|
|
|
+ data_offset->Type = cpu_to_le32(UNIX_CHARDEV);
|
|
|
+ else if (S_ISBLK(mode))
|
|
|
+ data_offset->Type = cpu_to_le32(UNIX_BLOCKDEV);
|
|
|
+ else if (S_ISFIFO(mode))
|
|
|
+ data_offset->Type = cpu_to_le32(UNIX_FIFO);
|
|
|
+ else if (S_ISSOCK(mode))
|
|
|
+ data_offset->Type = cpu_to_le32(UNIX_SOCKET);
|
|
|
+}
|
|
|
+
|
|
|
int
|
|
|
CIFSSMBUnixSetPathInfo(const int xid, struct cifsTconInfo *tcon, char *fileName,
|
|
|
const struct cifs_unix_set_info_args *args,
|
|
@@ -5086,7 +5127,6 @@ CIFSSMBUnixSetPathInfo(const int xid, struct cifsTconInfo *tcon, char *fileName,
|
|
|
int bytes_returned = 0;
|
|
|
FILE_UNIX_BASIC_INFO *data_offset;
|
|
|
__u16 params, param_offset, offset, count, byte_count;
|
|
|
- __u64 mode = args->mode;
|
|
|
|
|
|
cFYI(1, ("In SetUID/GID/Mode"));
|
|
|
setPermsRetry:
|
|
@@ -5137,38 +5177,8 @@ setPermsRetry:
|
|
|
pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_UNIX_BASIC);
|
|
|
pSMB->Reserved4 = 0;
|
|
|
pSMB->hdr.smb_buf_length += byte_count;
|
|
|
- /* Samba server ignores set of file size to zero due to bugs in some
|
|
|
- older clients, but we should be precise - we use SetFileSize to
|
|
|
- set file size and do not want to truncate file size to zero
|
|
|
- accidently as happened on one Samba server beta by putting
|
|
|
- zero instead of -1 here */
|
|
|
- data_offset->EndOfFile = cpu_to_le64(NO_CHANGE_64);
|
|
|
- data_offset->NumOfBytes = cpu_to_le64(NO_CHANGE_64);
|
|
|
- data_offset->LastStatusChange = cpu_to_le64(args->ctime);
|
|
|
- data_offset->LastAccessTime = cpu_to_le64(args->atime);
|
|
|
- data_offset->LastModificationTime = cpu_to_le64(args->mtime);
|
|
|
- data_offset->Uid = cpu_to_le64(args->uid);
|
|
|
- data_offset->Gid = cpu_to_le64(args->gid);
|
|
|
- /* better to leave device as zero when it is */
|
|
|
- data_offset->DevMajor = cpu_to_le64(MAJOR(args->device));
|
|
|
- data_offset->DevMinor = cpu_to_le64(MINOR(args->device));
|
|
|
- data_offset->Permissions = cpu_to_le64(mode);
|
|
|
-
|
|
|
- if (S_ISREG(mode))
|
|
|
- data_offset->Type = cpu_to_le32(UNIX_FILE);
|
|
|
- else if (S_ISDIR(mode))
|
|
|
- data_offset->Type = cpu_to_le32(UNIX_DIR);
|
|
|
- else if (S_ISLNK(mode))
|
|
|
- data_offset->Type = cpu_to_le32(UNIX_SYMLINK);
|
|
|
- else if (S_ISCHR(mode))
|
|
|
- data_offset->Type = cpu_to_le32(UNIX_CHARDEV);
|
|
|
- else if (S_ISBLK(mode))
|
|
|
- data_offset->Type = cpu_to_le32(UNIX_BLOCKDEV);
|
|
|
- else if (S_ISFIFO(mode))
|
|
|
- data_offset->Type = cpu_to_le32(UNIX_FIFO);
|
|
|
- else if (S_ISSOCK(mode))
|
|
|
- data_offset->Type = cpu_to_le32(UNIX_SOCKET);
|
|
|
|
|
|
+ cifs_fill_unix_set_info(data_offset, args);
|
|
|
|
|
|
pSMB->ByteCount = cpu_to_le16(byte_count);
|
|
|
rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
|