ksmbd: return FILE_DEVICE_DISK instead of super magic
authorNamjae Jeon <linkinjeon@kernel.org>
Sun, 23 Jun 2024 23:39:23 +0000 (08:39 +0900)
committerSteve French <stfrench@microsoft.com>
Thu, 4 Jul 2024 04:21:41 +0000 (23:21 -0500)
MS-SMB2 specification describes setting ->DeviceType to FILE_DEVICE_DISK
or FILE_DEVICE_CD_ROM. Set FILE_DEVICE_DISK instead of super magic in
FS_DEVICE_INFORMATION. And Set FILE_READ_ONLY_DEVICE for read-only share.

Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/common/smb2pdu.h
fs/smb/server/smb2pdu.c

index 8d10be1fe18a8d68077d97d3471129527152a1e6..c3ee42188d252ecb851e3c9fa64a7ba34d4f5278 100644 (file)
@@ -917,6 +917,40 @@ struct smb2_query_directory_rsp {
        __u8   Buffer[];
 } __packed;
 
+/* DeviceType Flags */
+#define FILE_DEVICE_CD_ROM              0x00000002
+#define FILE_DEVICE_CD_ROM_FILE_SYSTEM  0x00000003
+#define FILE_DEVICE_DFS                 0x00000006
+#define FILE_DEVICE_DISK                0x00000007
+#define FILE_DEVICE_DISK_FILE_SYSTEM    0x00000008
+#define FILE_DEVICE_FILE_SYSTEM         0x00000009
+#define FILE_DEVICE_NAMED_PIPE          0x00000011
+#define FILE_DEVICE_NETWORK             0x00000012
+#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
+#define FILE_DEVICE_NULL                0x00000015
+#define FILE_DEVICE_PARALLEL_PORT       0x00000016
+#define FILE_DEVICE_PRINTER             0x00000018
+#define FILE_DEVICE_SERIAL_PORT         0x0000001b
+#define FILE_DEVICE_STREAMS             0x0000001e
+#define FILE_DEVICE_TAPE                0x0000001f
+#define FILE_DEVICE_TAPE_FILE_SYSTEM    0x00000020
+#define FILE_DEVICE_VIRTUAL_DISK        0x00000024
+#define FILE_DEVICE_NETWORK_REDIRECTOR  0x00000028
+
+/* Device Characteristics */
+#define FILE_REMOVABLE_MEDIA                   0x00000001
+#define FILE_READ_ONLY_DEVICE                  0x00000002
+#define FILE_FLOPPY_DISKETTE                   0x00000004
+#define FILE_WRITE_ONCE_MEDIA                  0x00000008
+#define FILE_REMOTE_DEVICE                     0x00000010
+#define FILE_DEVICE_IS_MOUNTED                 0x00000020
+#define FILE_VIRTUAL_VOLUME                    0x00000040
+#define FILE_DEVICE_SECURE_OPEN                        0x00000100
+#define FILE_CHARACTERISTIC_TS_DEVICE          0x00001000
+#define FILE_CHARACTERISTIC_WEBDAV_DEVICE      0x00002000
+#define FILE_PORTABLE_DEVICE                   0x00004000
+#define FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL 0x00020000
+
 /*
  * Maximum number of iovs we need for a set-info request.
  * The largest one is rename/hardlink
index e7e07891781b36a21db07ef3160de4300e969261..786cd45fe18f10e00ef8ddbd1069c0a98d60f54b 100644 (file)
@@ -5314,8 +5314,13 @@ static int smb2_get_info_filesystem(struct ksmbd_work *work,
 
                info = (struct filesystem_device_info *)rsp->Buffer;
 
-               info->DeviceType = cpu_to_le32(stfs.f_type);
-               info->DeviceCharacteristics = cpu_to_le32(0x00000020);
+               info->DeviceType = cpu_to_le32(FILE_DEVICE_DISK);
+               info->DeviceCharacteristics =
+                       cpu_to_le32(FILE_DEVICE_IS_MOUNTED);
+               if (!test_tree_conn_flag(work->tcon,
+                                        KSMBD_TREE_CONN_FLAG_WRITABLE))
+                       info->DeviceCharacteristics |=
+                               cpu_to_le32(FILE_READ_ONLY_DEVICE);
                rsp->OutputBufferLength = cpu_to_le32(8);
                break;
        }