ksmbd: Implement new SMB3 POSIX type
commit e8580b4c600e085b3c8e6404392de2f822d4c132 upstream. As SMB3 posix extension specification, Give posix file type to posix mode. https://www.samba.org/~slow/SMB3_POSIX/fscc_posix_extensions.html#posix-file-type-definition Cc: stable@vger.kernel.org Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
de8d6de0ee
commit
38c229455b
@@ -3988,6 +3988,26 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
|
||||
posix_info->DeviceId = cpu_to_le32(ksmbd_kstat->kstat->rdev);
|
||||
posix_info->HardLinks = cpu_to_le32(ksmbd_kstat->kstat->nlink);
|
||||
posix_info->Mode = cpu_to_le32(ksmbd_kstat->kstat->mode & 0777);
|
||||
switch (ksmbd_kstat->kstat->mode & S_IFMT) {
|
||||
case S_IFDIR:
|
||||
posix_info->Mode |= cpu_to_le32(POSIX_TYPE_DIR << POSIX_FILETYPE_SHIFT);
|
||||
break;
|
||||
case S_IFLNK:
|
||||
posix_info->Mode |= cpu_to_le32(POSIX_TYPE_SYMLINK << POSIX_FILETYPE_SHIFT);
|
||||
break;
|
||||
case S_IFCHR:
|
||||
posix_info->Mode |= cpu_to_le32(POSIX_TYPE_CHARDEV << POSIX_FILETYPE_SHIFT);
|
||||
break;
|
||||
case S_IFBLK:
|
||||
posix_info->Mode |= cpu_to_le32(POSIX_TYPE_BLKDEV << POSIX_FILETYPE_SHIFT);
|
||||
break;
|
||||
case S_IFIFO:
|
||||
posix_info->Mode |= cpu_to_le32(POSIX_TYPE_FIFO << POSIX_FILETYPE_SHIFT);
|
||||
break;
|
||||
case S_IFSOCK:
|
||||
posix_info->Mode |= cpu_to_le32(POSIX_TYPE_SOCKET << POSIX_FILETYPE_SHIFT);
|
||||
}
|
||||
|
||||
posix_info->Inode = cpu_to_le64(ksmbd_kstat->kstat->ino);
|
||||
posix_info->DosAttributes =
|
||||
S_ISDIR(ksmbd_kstat->kstat->mode) ?
|
||||
@@ -5176,6 +5196,26 @@ static int find_file_posix_info(struct smb2_query_info_rsp *rsp,
|
||||
file_info->AllocationSize = cpu_to_le64(stat.blocks << 9);
|
||||
file_info->HardLinks = cpu_to_le32(stat.nlink);
|
||||
file_info->Mode = cpu_to_le32(stat.mode & 0777);
|
||||
switch (stat.mode & S_IFMT) {
|
||||
case S_IFDIR:
|
||||
file_info->Mode |= cpu_to_le32(POSIX_TYPE_DIR << POSIX_FILETYPE_SHIFT);
|
||||
break;
|
||||
case S_IFLNK:
|
||||
file_info->Mode |= cpu_to_le32(POSIX_TYPE_SYMLINK << POSIX_FILETYPE_SHIFT);
|
||||
break;
|
||||
case S_IFCHR:
|
||||
file_info->Mode |= cpu_to_le32(POSIX_TYPE_CHARDEV << POSIX_FILETYPE_SHIFT);
|
||||
break;
|
||||
case S_IFBLK:
|
||||
file_info->Mode |= cpu_to_le32(POSIX_TYPE_BLKDEV << POSIX_FILETYPE_SHIFT);
|
||||
break;
|
||||
case S_IFIFO:
|
||||
file_info->Mode |= cpu_to_le32(POSIX_TYPE_FIFO << POSIX_FILETYPE_SHIFT);
|
||||
break;
|
||||
case S_IFSOCK:
|
||||
file_info->Mode |= cpu_to_le32(POSIX_TYPE_SOCKET << POSIX_FILETYPE_SHIFT);
|
||||
}
|
||||
|
||||
file_info->DeviceId = cpu_to_le32(stat.rdev);
|
||||
|
||||
/*
|
||||
|
||||
@@ -502,4 +502,14 @@ static inline void *smb2_get_msg(void *buf)
|
||||
return buf + 4;
|
||||
}
|
||||
|
||||
#define POSIX_TYPE_FILE 0
|
||||
#define POSIX_TYPE_DIR 1
|
||||
#define POSIX_TYPE_SYMLINK 2
|
||||
#define POSIX_TYPE_CHARDEV 3
|
||||
#define POSIX_TYPE_BLKDEV 4
|
||||
#define POSIX_TYPE_FIFO 5
|
||||
#define POSIX_TYPE_SOCKET 6
|
||||
|
||||
#define POSIX_FILETYPE_SHIFT 12
|
||||
|
||||
#endif /* _SMB2PDU_H */
|
||||
|
||||
Reference in New Issue
Block a user