Skip to content

Commit e8580b4

Browse files
namjaejeonsmfrench
authored andcommitted
ksmbd: Implement new SMB3 POSIX type
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: [email protected] Signed-off-by: Namjae Jeon <[email protected]> Signed-off-by: Steve French <[email protected]>
1 parent 2ac538e commit e8580b4

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

fs/smb/server/smb2pdu.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3994,6 +3994,26 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
39943994
posix_info->DeviceId = cpu_to_le32(ksmbd_kstat->kstat->rdev);
39953995
posix_info->HardLinks = cpu_to_le32(ksmbd_kstat->kstat->nlink);
39963996
posix_info->Mode = cpu_to_le32(ksmbd_kstat->kstat->mode & 0777);
3997+
switch (ksmbd_kstat->kstat->mode & S_IFMT) {
3998+
case S_IFDIR:
3999+
posix_info->Mode |= cpu_to_le32(POSIX_TYPE_DIR << POSIX_FILETYPE_SHIFT);
4000+
break;
4001+
case S_IFLNK:
4002+
posix_info->Mode |= cpu_to_le32(POSIX_TYPE_SYMLINK << POSIX_FILETYPE_SHIFT);
4003+
break;
4004+
case S_IFCHR:
4005+
posix_info->Mode |= cpu_to_le32(POSIX_TYPE_CHARDEV << POSIX_FILETYPE_SHIFT);
4006+
break;
4007+
case S_IFBLK:
4008+
posix_info->Mode |= cpu_to_le32(POSIX_TYPE_BLKDEV << POSIX_FILETYPE_SHIFT);
4009+
break;
4010+
case S_IFIFO:
4011+
posix_info->Mode |= cpu_to_le32(POSIX_TYPE_FIFO << POSIX_FILETYPE_SHIFT);
4012+
break;
4013+
case S_IFSOCK:
4014+
posix_info->Mode |= cpu_to_le32(POSIX_TYPE_SOCKET << POSIX_FILETYPE_SHIFT);
4015+
}
4016+
39974017
posix_info->Inode = cpu_to_le64(ksmbd_kstat->kstat->ino);
39984018
posix_info->DosAttributes =
39994019
S_ISDIR(ksmbd_kstat->kstat->mode) ?
@@ -5184,6 +5204,26 @@ static int find_file_posix_info(struct smb2_query_info_rsp *rsp,
51845204
file_info->AllocationSize = cpu_to_le64(stat.blocks << 9);
51855205
file_info->HardLinks = cpu_to_le32(stat.nlink);
51865206
file_info->Mode = cpu_to_le32(stat.mode & 0777);
5207+
switch (stat.mode & S_IFMT) {
5208+
case S_IFDIR:
5209+
file_info->Mode |= cpu_to_le32(POSIX_TYPE_DIR << POSIX_FILETYPE_SHIFT);
5210+
break;
5211+
case S_IFLNK:
5212+
file_info->Mode |= cpu_to_le32(POSIX_TYPE_SYMLINK << POSIX_FILETYPE_SHIFT);
5213+
break;
5214+
case S_IFCHR:
5215+
file_info->Mode |= cpu_to_le32(POSIX_TYPE_CHARDEV << POSIX_FILETYPE_SHIFT);
5216+
break;
5217+
case S_IFBLK:
5218+
file_info->Mode |= cpu_to_le32(POSIX_TYPE_BLKDEV << POSIX_FILETYPE_SHIFT);
5219+
break;
5220+
case S_IFIFO:
5221+
file_info->Mode |= cpu_to_le32(POSIX_TYPE_FIFO << POSIX_FILETYPE_SHIFT);
5222+
break;
5223+
case S_IFSOCK:
5224+
file_info->Mode |= cpu_to_le32(POSIX_TYPE_SOCKET << POSIX_FILETYPE_SHIFT);
5225+
}
5226+
51875227
file_info->DeviceId = cpu_to_le32(stat.rdev);
51885228

51895229
/*

fs/smb/server/smb2pdu.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,4 +502,14 @@ static inline void *smb2_get_msg(void *buf)
502502
return buf + 4;
503503
}
504504

505+
#define POSIX_TYPE_FILE 0
506+
#define POSIX_TYPE_DIR 1
507+
#define POSIX_TYPE_SYMLINK 2
508+
#define POSIX_TYPE_CHARDEV 3
509+
#define POSIX_TYPE_BLKDEV 4
510+
#define POSIX_TYPE_FIFO 5
511+
#define POSIX_TYPE_SOCKET 6
512+
513+
#define POSIX_FILETYPE_SHIFT 12
514+
505515
#endif /* _SMB2PDU_H */

0 commit comments

Comments
 (0)