xref: /linux/fs/smb/common/fscc.h (revision 10cc3e9a11dc0d5d8450ecf6db99551c867f3203)
184d8d4cfSChenXiaoSong /* SPDX-License-Identifier: LGPL-2.1 */
284d8d4cfSChenXiaoSong /*
384d8d4cfSChenXiaoSong  *
484d8d4cfSChenXiaoSong  *   Copyright (c) International Business Machines  Corp., 2009, 2013
584d8d4cfSChenXiaoSong  *                 Etersoft, 2012
684d8d4cfSChenXiaoSong  *                 2018 Samsung Electronics Co., Ltd.
784d8d4cfSChenXiaoSong  *   Author(s): Steve French (sfrench@us.ibm.com)
884d8d4cfSChenXiaoSong  *              Pavel Shilovsky (pshilovsky@samba.org) 2012
984d8d4cfSChenXiaoSong  *              Namjae Jeon (linkinjeon@kernel.org)
1084d8d4cfSChenXiaoSong  *
1184d8d4cfSChenXiaoSong  */
1284d8d4cfSChenXiaoSong #ifndef _COMMON_SMB_FSCC_H
1384d8d4cfSChenXiaoSong #define _COMMON_SMB_FSCC_H
1484d8d4cfSChenXiaoSong 
15d7edd389SChenXiaoSong /* See MS-FSCC 2.4.8 */
16d7edd389SChenXiaoSong typedef struct {
17d7edd389SChenXiaoSong 	__le32 NextEntryOffset;
18d7edd389SChenXiaoSong 	__u32 FileIndex;
19d7edd389SChenXiaoSong 	__le64 CreationTime;
20d7edd389SChenXiaoSong 	__le64 LastAccessTime;
21d7edd389SChenXiaoSong 	__le64 LastWriteTime;
22d7edd389SChenXiaoSong 	__le64 ChangeTime;
23d7edd389SChenXiaoSong 	__le64 EndOfFile;
24d7edd389SChenXiaoSong 	__le64 AllocationSize;
25d7edd389SChenXiaoSong 	__le32 ExtFileAttributes;
26d7edd389SChenXiaoSong 	__le32 FileNameLength;
27d7edd389SChenXiaoSong 	__le32 EaSize; /* length of the xattrs */
28d7edd389SChenXiaoSong 	__u8   ShortNameLength;
29d7edd389SChenXiaoSong 	__u8   Reserved;
30d7edd389SChenXiaoSong 	__u8   ShortName[24];
31d7edd389SChenXiaoSong 	char FileName[];
32d7edd389SChenXiaoSong } __packed FILE_BOTH_DIRECTORY_INFO; /* level 0x104 FFrsp data */
33d7edd389SChenXiaoSong 
34d7edd389SChenXiaoSong /* See MS-FSCC 2.4.10 */
35d7edd389SChenXiaoSong typedef struct {
36d7edd389SChenXiaoSong 	__le32 NextEntryOffset;
37d7edd389SChenXiaoSong 	__u32 FileIndex;
38d7edd389SChenXiaoSong 	__le64 CreationTime;
39d7edd389SChenXiaoSong 	__le64 LastAccessTime;
40d7edd389SChenXiaoSong 	__le64 LastWriteTime;
41d7edd389SChenXiaoSong 	__le64 ChangeTime;
42d7edd389SChenXiaoSong 	__le64 EndOfFile;
43d7edd389SChenXiaoSong 	__le64 AllocationSize;
44d7edd389SChenXiaoSong 	__le32 ExtFileAttributes;
45d7edd389SChenXiaoSong 	__le32 FileNameLength;
46d7edd389SChenXiaoSong 	char FileName[];
47d7edd389SChenXiaoSong } __packed FILE_DIRECTORY_INFO;   /* level 0x101 FF resp data */
48d7edd389SChenXiaoSong 
49d7edd389SChenXiaoSong /* See MS-FSCC 2.4.14 */
50d7edd389SChenXiaoSong typedef struct {
51d7edd389SChenXiaoSong 	__le32 NextEntryOffset;
52d7edd389SChenXiaoSong 	__u32 FileIndex;
53d7edd389SChenXiaoSong 	__le64 CreationTime;
54d7edd389SChenXiaoSong 	__le64 LastAccessTime;
55d7edd389SChenXiaoSong 	__le64 LastWriteTime;
56d7edd389SChenXiaoSong 	__le64 ChangeTime;
57d7edd389SChenXiaoSong 	__le64 EndOfFile;
58d7edd389SChenXiaoSong 	__le64 AllocationSize;
59d7edd389SChenXiaoSong 	__le32 ExtFileAttributes;
60d7edd389SChenXiaoSong 	__le32 FileNameLength;
61d7edd389SChenXiaoSong 	__le32 EaSize; /* length of the xattrs */
62d7edd389SChenXiaoSong 	char FileName[];
63d7edd389SChenXiaoSong } __packed FILE_FULL_DIRECTORY_INFO; /* level 0x102 rsp data */
64d7edd389SChenXiaoSong 
65d7edd389SChenXiaoSong /* See MS-FSCC 2.4.24 */
66d7edd389SChenXiaoSong typedef struct {
67d7edd389SChenXiaoSong 	__le32 NextEntryOffset;
68d7edd389SChenXiaoSong 	__u32 FileIndex;
69d7edd389SChenXiaoSong 	__le64 CreationTime;
70d7edd389SChenXiaoSong 	__le64 LastAccessTime;
71d7edd389SChenXiaoSong 	__le64 LastWriteTime;
72d7edd389SChenXiaoSong 	__le64 ChangeTime;
73d7edd389SChenXiaoSong 	__le64 EndOfFile;
74d7edd389SChenXiaoSong 	__le64 AllocationSize;
75d7edd389SChenXiaoSong 	__le32 ExtFileAttributes;
76d7edd389SChenXiaoSong 	__le32 FileNameLength;
77d7edd389SChenXiaoSong 	__le32 EaSize; /* EA size */
78d7edd389SChenXiaoSong 	__le32 Reserved;
79d7edd389SChenXiaoSong 	__le64 UniqueId; /* inode num - le since Samba puts ino in low 32 bit*/
80d7edd389SChenXiaoSong 	char FileName[];
81d7edd389SChenXiaoSong } __packed FILE_ID_FULL_DIR_INFO; /* level 0x105 FF rsp data */
82d7edd389SChenXiaoSong 
83d7edd389SChenXiaoSong /* See MS-FSCC 2.4.34 */
84d7edd389SChenXiaoSong struct smb2_file_network_open_info {
85d7edd389SChenXiaoSong 	struct_group_attr(network_open_info, __packed,
86d7edd389SChenXiaoSong 		__le64 CreationTime;
87d7edd389SChenXiaoSong 		__le64 LastAccessTime;
88d7edd389SChenXiaoSong 		__le64 LastWriteTime;
89d7edd389SChenXiaoSong 		__le64 ChangeTime;
90d7edd389SChenXiaoSong 		__le64 AllocationSize;
91d7edd389SChenXiaoSong 		__le64 EndOfFile;
92d7edd389SChenXiaoSong 		__le32 Attributes;
93d7edd389SChenXiaoSong 	);
94d7edd389SChenXiaoSong 	__le32 Reserved;
95d7edd389SChenXiaoSong } __packed; /* level 34 Query also similar returned in close rsp and open rsp */
96d7edd389SChenXiaoSong 
97c4a2a49fSChenXiaoSong /* See MS-FSCC 2.5.1 */
98c4a2a49fSChenXiaoSong #define MAX_FS_NAME_LEN		52
99c4a2a49fSChenXiaoSong typedef struct {
100c4a2a49fSChenXiaoSong 	__le32 Attributes;
101c4a2a49fSChenXiaoSong 	__le32 MaxPathNameComponentLength;
102c4a2a49fSChenXiaoSong 	__le32 FileSystemNameLen;
103c4a2a49fSChenXiaoSong 	__le16 FileSystemName[]; /* do not have to save this - get subset? */
104c4a2a49fSChenXiaoSong } __packed FILE_SYSTEM_ATTRIBUTE_INFO;
105c4a2a49fSChenXiaoSong 
10684d8d4cfSChenXiaoSong /* List of FileSystemAttributes - see MS-FSCC 2.5.1 */
10784d8d4cfSChenXiaoSong #define FILE_SUPPORTS_SPARSE_VDL	0x10000000 /* faster nonsparse extend */
10884d8d4cfSChenXiaoSong #define FILE_SUPPORTS_BLOCK_REFCOUNTING	0x08000000 /* allow ioctl dup extents */
10984d8d4cfSChenXiaoSong #define FILE_SUPPORT_INTEGRITY_STREAMS	0x04000000
11084d8d4cfSChenXiaoSong #define FILE_SUPPORTS_USN_JOURNAL	0x02000000
11184d8d4cfSChenXiaoSong #define FILE_SUPPORTS_OPEN_BY_FILE_ID	0x01000000
11284d8d4cfSChenXiaoSong #define FILE_SUPPORTS_EXTENDED_ATTRIBUTES 0x00800000
11384d8d4cfSChenXiaoSong #define FILE_SUPPORTS_HARD_LINKS	0x00400000
11484d8d4cfSChenXiaoSong #define FILE_SUPPORTS_TRANSACTIONS	0x00200000
11584d8d4cfSChenXiaoSong #define FILE_SEQUENTIAL_WRITE_ONCE	0x00100000
11684d8d4cfSChenXiaoSong #define FILE_READ_ONLY_VOLUME		0x00080000
11784d8d4cfSChenXiaoSong #define FILE_NAMED_STREAMS		0x00040000
11884d8d4cfSChenXiaoSong #define FILE_SUPPORTS_ENCRYPTION	0x00020000
11984d8d4cfSChenXiaoSong #define FILE_SUPPORTS_OBJECT_IDS	0x00010000
12084d8d4cfSChenXiaoSong #define FILE_VOLUME_IS_COMPRESSED	0x00008000
12184d8d4cfSChenXiaoSong #define FILE_SUPPORTS_POSIX_UNLINK_RENAME 0x00000400
12284d8d4cfSChenXiaoSong #define FILE_RETURNS_CLEANUP_RESULT_INFO  0x00000200
12384d8d4cfSChenXiaoSong #define FILE_SUPPORTS_REMOTE_STORAGE	0x00000100
12484d8d4cfSChenXiaoSong #define FILE_SUPPORTS_REPARSE_POINTS	0x00000080
12584d8d4cfSChenXiaoSong #define FILE_SUPPORTS_SPARSE_FILES	0x00000040
12684d8d4cfSChenXiaoSong #define FILE_VOLUME_QUOTAS		0x00000020
12784d8d4cfSChenXiaoSong #define FILE_FILE_COMPRESSION		0x00000010
12884d8d4cfSChenXiaoSong #define FILE_PERSISTENT_ACLS		0x00000008
12984d8d4cfSChenXiaoSong #define FILE_UNICODE_ON_DISK		0x00000004
13084d8d4cfSChenXiaoSong #define FILE_CASE_PRESERVED_NAMES	0x00000002
13184d8d4cfSChenXiaoSong #define FILE_CASE_SENSITIVE_SEARCH	0x00000001
13284d8d4cfSChenXiaoSong 
133464b9139SChenXiaoSong /* See MS-FSCC 2.5.8 */
134464b9139SChenXiaoSong typedef struct {
135464b9139SChenXiaoSong 	__le64 TotalAllocationUnits;
136464b9139SChenXiaoSong 	__le64 AvailableAllocationUnits;
137464b9139SChenXiaoSong 	__le32 SectorsPerAllocationUnit;
138464b9139SChenXiaoSong 	__le32 BytesPerSector;
139464b9139SChenXiaoSong } __packed FILE_SYSTEM_SIZE_INFO;	/* size info, level 0x103 */
140464b9139SChenXiaoSong 
141d7edd389SChenXiaoSong /* See MS-FSCC 2.5.10 */
142d7edd389SChenXiaoSong typedef struct {
143d7edd389SChenXiaoSong 	__le32 DeviceType;
144d7edd389SChenXiaoSong 	__le32 DeviceCharacteristics;
145d7edd389SChenXiaoSong } __packed FILE_SYSTEM_DEVICE_INFO; /* device info level 0x104 */
146d7edd389SChenXiaoSong 
147d7edd389SChenXiaoSong /*
148*2b6abb89SChenXiaoSong  * File Attributes
149*2b6abb89SChenXiaoSong  * See MS-FSCC 2.6
150*2b6abb89SChenXiaoSong  */
151*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_READONLY			0x00000001
152*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_HIDDEN			0x00000002
153*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_SYSTEM			0x00000004
154*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_DIRECTORY		0x00000010
155*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_ARCHIVE			0x00000020
156*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_NORMAL			0x00000080
157*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_TEMPORARY		0x00000100
158*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_SPARSE_FILE		0x00000200
159*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_REPARSE_POINT		0x00000400
160*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_COMPRESSED		0x00000800
161*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_OFFLINE			0x00001000
162*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED	0x00002000
163*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_ENCRYPTED		0x00004000
164*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_INTEGRITY_STREAM		0x00008000
165*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_NO_SCRUB_DATA		0x00020000
166*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_MASK (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN | \
167*2b6abb89SChenXiaoSong 		FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_DIRECTORY | \
168*2b6abb89SChenXiaoSong 		FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_NORMAL | \
169*2b6abb89SChenXiaoSong 		FILE_ATTRIBUTE_TEMPORARY | FILE_ATTRIBUTE_SPARSE_FILE | \
170*2b6abb89SChenXiaoSong 		FILE_ATTRIBUTE_REPARSE_POINT | FILE_ATTRIBUTE_COMPRESSED | \
171*2b6abb89SChenXiaoSong 		FILE_ATTRIBUTE_OFFLINE | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED | \
172*2b6abb89SChenXiaoSong 		FILE_ATTRIBUTE_ENCRYPTED | FILE_ATTRIBUTE_INTEGRITY_STREAM | \
173*2b6abb89SChenXiaoSong 		FILE_ATTRIBUTE_NO_SCRUB_DATA)
174*2b6abb89SChenXiaoSong 
175*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_READONLY_LE		cpu_to_le32(FILE_ATTRIBUTE_READONLY)
176*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_HIDDEN_LE		cpu_to_le32(FILE_ATTRIBUTE_HIDDEN)
177*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_SYSTEM_LE		cpu_to_le32(FILE_ATTRIBUTE_SYSTEM)
178*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_DIRECTORY_LE		cpu_to_le32(FILE_ATTRIBUTE_DIRECTORY)
179*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_ARCHIVE_LE		cpu_to_le32(FILE_ATTRIBUTE_ARCHIVE)
180*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_NORMAL_LE		cpu_to_le32(FILE_ATTRIBUTE_NORMAL)
181*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_TEMPORARY_LE		cpu_to_le32(FILE_ATTRIBUTE_TEMPORARY)
182*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_SPARSE_FILE_LE		cpu_to_le32(FILE_ATTRIBUTE_SPARSE_FILE)
183*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_REPARSE_POINT_LE		cpu_to_le32(FILE_ATTRIBUTE_REPARSE_POINT)
184*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_COMPRESSED_LE		cpu_to_le32(FILE_ATTRIBUTE_COMPRESSED)
185*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_OFFLINE_LE		cpu_to_le32(FILE_ATTRIBUTE_OFFLINE)
186*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED_LE	cpu_to_le32(FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)
187*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_ENCRYPTED_LE		cpu_to_le32(FILE_ATTRIBUTE_ENCRYPTED)
188*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_INTEGRITY_STREAM_LE	cpu_to_le32(FILE_ATTRIBUTE_INTEGRITY_STREAM)
189*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_NO_SCRUB_DATA_LE		cpu_to_le32(FILE_ATTRIBUTE_NO_SCRUB_DATA)
190*2b6abb89SChenXiaoSong #define FILE_ATTRIBUTE_MASK_LE			cpu_to_le32(FILE_ATTRIBUTE_MASK)
191*2b6abb89SChenXiaoSong 
192*2b6abb89SChenXiaoSong /*
19308c2a7d2SChenXiaoSong  * Response contains array of the following structures
19408c2a7d2SChenXiaoSong  * See MS-FSCC 2.7.1
19508c2a7d2SChenXiaoSong  */
19608c2a7d2SChenXiaoSong struct file_notify_information {
19708c2a7d2SChenXiaoSong 	__le32 NextEntryOffset;
19808c2a7d2SChenXiaoSong 	__le32 Action;
19908c2a7d2SChenXiaoSong 	__le32 FileNameLength;
20008c2a7d2SChenXiaoSong 	__u8  FileName[];
20108c2a7d2SChenXiaoSong } __packed;
20208c2a7d2SChenXiaoSong 
20308c2a7d2SChenXiaoSong /*
204d7edd389SChenXiaoSong  * See POSIX Extensions to MS-FSCC 2.3.2.1
205d7edd389SChenXiaoSong  * Link: https://gitlab.com/samba-team/smb3-posix-spec/-/blob/master/fscc_posix_extensions.md
206d7edd389SChenXiaoSong  */
207d7edd389SChenXiaoSong typedef struct {
208d7edd389SChenXiaoSong 	/* For undefined recommended transfer size return -1 in that field */
209d7edd389SChenXiaoSong 	__le32 OptimalTransferSize;  /* bsize on some os, iosize on other os */
210d7edd389SChenXiaoSong 	__le32 BlockSize;
211d7edd389SChenXiaoSong 	/* The next three fields are in terms of the block size.
212d7edd389SChenXiaoSong 	 * (above). If block size is unknown, 4096 would be a
213d7edd389SChenXiaoSong 	 * reasonable block size for a server to report.
214d7edd389SChenXiaoSong 	 * Note that returning the blocks/blocksavail removes need
215d7edd389SChenXiaoSong 	 * to make a second call (to QFSInfo level 0x103 to get this info.
216d7edd389SChenXiaoSong 	 * UserBlockAvail is typically less than or equal to BlocksAvail,
217d7edd389SChenXiaoSong 	 * if no distinction is made return the same value in each
218d7edd389SChenXiaoSong 	 */
219d7edd389SChenXiaoSong 	__le64 TotalBlocks;
220d7edd389SChenXiaoSong 	__le64 BlocksAvail;       /* bfree */
221d7edd389SChenXiaoSong 	__le64 UserBlocksAvail;   /* bavail */
222d7edd389SChenXiaoSong 	/* For undefined Node fields or FSID return -1 */
223d7edd389SChenXiaoSong 	__le64 TotalFileNodes;
224d7edd389SChenXiaoSong 	__le64 FreeFileNodes;
225d7edd389SChenXiaoSong 	__le64 FileSysIdentifier;   /* fsid */
226d7edd389SChenXiaoSong 	/* NB Namelen comes from FILE_SYSTEM_ATTRIBUTE_INFO call */
227d7edd389SChenXiaoSong 	/* NB flags can come from FILE_SYSTEM_DEVICE_INFO call   */
228d7edd389SChenXiaoSong } __packed FILE_SYSTEM_POSIX_INFO;
229d7edd389SChenXiaoSong 
23084d8d4cfSChenXiaoSong #endif /* _COMMON_SMB_FSCC_H */
231