]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ksmbd: Implement new SMB3 POSIX type
authorNamjae Jeon <linkinjeon@kernel.org>
Tue, 7 Jan 2025 08:41:21 +0000 (17:41 +0900)
committerSteve French <stfrench@microsoft.com>
Wed, 8 Jan 2025 00:48:49 +0000 (18:48 -0600)
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>
fs/smb/server/smb2pdu.c
fs/smb/server/smb2pdu.h

index 433e33c04039b39da62ef6f9e3d26a185860dae3..772deec5b90f4741292686b0b5d14ed629362aa2 100644 (file)
@@ -3994,6 +3994,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) ?
@@ -5184,6 +5204,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);
 
        /*
index 649dacf7e8c4935b62216ba58ee6810bda0ac3b1..17a0b18a8406b3737521b44f82f67a35fd98f746 100644 (file)
@@ -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 */