Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

smb: move FILE_SYSTEM_ATTRIBUTE_INFO to common/fscc.h

Modify the following places:

- struct filesystem_attribute_info -> FILE_SYSTEM_ATTRIBUTE_INFO
- Remove MIN_FS_ATTR_INFO_SIZE definition
- Introduce MAX_FS_NAME_LEN
- max_len of FileFsAttributeInformation -> sizeof(FILE_SYSTEM_ATTRIBUTE_INFO) + MAX_FS_NAME_LEN
- min_len of FileFsAttributeInformation -> sizeof(FILE_SYSTEM_ATTRIBUTE_INFO)
- SMB2_QFS_attr(): memcpy(..., min_len)

Then move FILE_SYSTEM_ATTRIBUTE_INFO to common header file.

I have tested the relevant code related to FILE_SYSTEM_ATTRIBUTE_INFO (Link[1]).

Link[1]: https://chenxiaosong.com/en/FILE_SYSTEM_ATTRIBUTE_INFO.html
Suggested-by: Namjae Jeon <linkinjeon@kernel.org>
Tested-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
Signed-off-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>

authored by

ChenXiaoSong and committed by
Steve French
c4a2a49f e4442b2e

+15 -23
-10
fs/smb/client/cifspdu.h
··· 2068 2068 #define FILE_PORTABLE_DEVICE 0x00004000 2069 2069 #define FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL 0x00020000 2070 2070 2071 - /* minimum includes first three fields, and empty FS Name */ 2072 - #define MIN_FS_ATTR_INFO_SIZE 12 2073 - 2074 - typedef struct { 2075 - __le32 Attributes; 2076 - __le32 MaxPathNameComponentLength; 2077 - __le32 FileSystemNameLen; 2078 - char FileSystemName[52]; /* do not have to save this - get subset? */ 2079 - } __attribute__((packed)) FILE_SYSTEM_ATTRIBUTE_INFO; 2080 - 2081 2071 /******************************************************************************/ 2082 2072 /* QueryFileInfo/QueryPathinfo (also for SetPath/SetFile) data buffer formats */ 2083 2073 /******************************************************************************/
+3 -3
fs/smb/client/smb2pdu.c
··· 5981 5981 max_len = sizeof(FILE_SYSTEM_DEVICE_INFO); 5982 5982 min_len = sizeof(FILE_SYSTEM_DEVICE_INFO); 5983 5983 } else if (level == FS_ATTRIBUTE_INFORMATION) { 5984 - max_len = sizeof(FILE_SYSTEM_ATTRIBUTE_INFO); 5985 - min_len = MIN_FS_ATTR_INFO_SIZE; 5984 + max_len = sizeof(FILE_SYSTEM_ATTRIBUTE_INFO) + MAX_FS_NAME_LEN; 5985 + min_len = sizeof(FILE_SYSTEM_ATTRIBUTE_INFO); 5986 5986 } else if (level == FS_SECTOR_SIZE_INFORMATION) { 5987 5987 max_len = sizeof(struct smb3_fs_ss_info); 5988 5988 min_len = sizeof(struct smb3_fs_ss_info); ··· 6028 6028 if (level == FS_ATTRIBUTE_INFORMATION) 6029 6029 memcpy(&tcon->fsAttrInfo, offset 6030 6030 + (char *)rsp, min_t(unsigned int, 6031 - rsp_len, max_len)); 6031 + rsp_len, min_len)); 6032 6032 else if (level == FS_DEVICE_INFORMATION) 6033 6033 memcpy(&tcon->fsDevInfo, offset 6034 6034 + (char *)rsp, sizeof(FILE_SYSTEM_DEVICE_INFO));
+9
fs/smb/common/fscc.h
··· 94 94 __le32 Reserved; 95 95 } __packed; /* level 34 Query also similar returned in close rsp and open rsp */ 96 96 97 + /* See MS-FSCC 2.5.1 */ 98 + #define MAX_FS_NAME_LEN 52 99 + typedef struct { 100 + __le32 Attributes; 101 + __le32 MaxPathNameComponentLength; 102 + __le32 FileSystemNameLen; 103 + __le16 FileSystemName[]; /* do not have to save this - get subset? */ 104 + } __packed FILE_SYSTEM_ATTRIBUTE_INFO; 105 + 97 106 /* List of FileSystemAttributes - see MS-FSCC 2.5.1 */ 98 107 #define FILE_SUPPORTS_SPARSE_VDL 0x10000000 /* faster nonsparse extend */ 99 108 #define FILE_SUPPORTS_BLOCK_REFCOUNTING 0x08000000 /* allow ioctl dup extents */
+3 -3
fs/smb/server/smb2pdu.c
··· 5479 5479 } 5480 5480 case FS_ATTRIBUTE_INFORMATION: 5481 5481 { 5482 - struct filesystem_attribute_info *info; 5482 + FILE_SYSTEM_ATTRIBUTE_INFO *info; 5483 5483 size_t sz; 5484 5484 5485 - info = (struct filesystem_attribute_info *)rsp->Buffer; 5485 + info = (FILE_SYSTEM_ATTRIBUTE_INFO *)rsp->Buffer; 5486 5486 info->Attributes = cpu_to_le32(FILE_SUPPORTS_OBJECT_IDS | 5487 5487 FILE_PERSISTENT_ACLS | 5488 5488 FILE_UNICODE_ON_DISK | ··· 5501 5501 "NTFS", PATH_MAX, conn->local_nls, 0); 5502 5502 len = len * 2; 5503 5503 info->FileSystemNameLen = cpu_to_le32(len); 5504 - sz = sizeof(struct filesystem_attribute_info) + len; 5504 + sz = sizeof(FILE_SYSTEM_ATTRIBUTE_INFO) + len; 5505 5505 rsp->OutputBufferLength = cpu_to_le32(sz); 5506 5506 break; 5507 5507 }
-7
fs/smb/server/smb_common.h
··· 90 90 __le16 ByteCount; 91 91 } __packed; 92 92 93 - struct filesystem_attribute_info { 94 - __le32 Attributes; 95 - __le32 MaxPathNameComponentLength; 96 - __le32 FileSystemNameLen; 97 - __le16 FileSystemName[]; /* do not have to save this - get subset? */ 98 - } __packed; 99 - 100 93 struct filesystem_vol_info { 101 94 __le64 VolumeCreationTime; 102 95 __le32 SerialNumber;