cifs: make a separate function for filling out FILE_UNIX_BASIC_INFO
cifs: make a separate function for filling out FILE_UNIX_BASIC_INFO The SET_FILE_INFO variant will need to do the same thing here. Break this code out into a separate function that both variants can call. Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:
parent
01ea95e3b6
commit
654cf14ac0
1 changed files with 42 additions and 32 deletions
|
@ -5074,6 +5074,47 @@ CIFSSMBSetAttrLegacy(int xid, struct cifsTconInfo *tcon, char *fileName,
|
|||
}
|
||||
#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 @@ CIFSSMBUnixSetPathInfo(const int xid, struct cifsTconInfo *tcon, char *fileName,
|
|||
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,
|
||||
|
|
Loading…
Reference in a new issue