smb: move some duplicate struct definitions to common/fscc.h

Modify the following places:

  - smb2_file_ntwrk_info -> smb2_file_network_open_info
  - struct filesystem_device_info -> FILE_SYSTEM_DEVICE_INFO
  - struct file_directory_info -> FILE_DIRECTORY_INFO
  - struct file_full_directory_info -> FILE_FULL_DIRECTORY_INFO
  - struct file_both_directory_info -> FILE_BOTH_DIRECTORY_INFO
  - struct file_id_full_dir_info -> FILE_ID_FULL_DIR_INFO
  - struct filesystem_posix_info -> FILE_SYSTEM_POSIX_INFO

The fields of these structures are exactly the same on both client and
server, so move duplicate definitions to common header file.

Signed-off-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
ChenXiaoSong 2025-11-02 15:30:55 +08:00 committed by Steve French
parent 84d8d4cf88
commit d7edd3892d
10 changed files with 156 additions and 248 deletions

View File

@ -2036,28 +2036,6 @@ typedef struct {
#define CIFS_POSIX_EXTENSIONS 0x00000010 /* support for new QFSInfo */ #define CIFS_POSIX_EXTENSIONS 0x00000010 /* support for new QFSInfo */
typedef struct {
/* For undefined recommended transfer size return -1 in that field */
__le32 OptimalTransferSize; /* bsize on some os, iosize on other os */
__le32 BlockSize;
/* The next three fields are in terms of the block size.
(above). If block size is unknown, 4096 would be a
reasonable block size for a server to report.
Note that returning the blocks/blocksavail removes need
to make a second call (to QFSInfo level 0x103 to get this info.
UserBlockAvail is typically less than or equal to BlocksAvail,
if no distinction is made return the same value in each */
__le64 TotalBlocks;
__le64 BlocksAvail; /* bfree */
__le64 UserBlocksAvail; /* bavail */
/* For undefined Node fields or FSID return -1 */
__le64 TotalFileNodes;
__le64 FreeFileNodes;
__le64 FileSysIdentifier; /* fsid */
/* NB Namelen comes from FILE_SYSTEM_ATTRIBUTE_INFO call */
/* NB flags can come from FILE_SYSTEM_DEVICE_INFO call */
} __attribute__((packed)) FILE_SYSTEM_POSIX_INFO;
/* DeviceType Flags */ /* DeviceType Flags */
#define FILE_DEVICE_CD_ROM 0x00000002 #define FILE_DEVICE_CD_ROM 0x00000002
#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
@ -2092,11 +2070,6 @@ typedef struct {
#define FILE_PORTABLE_DEVICE 0x00004000 #define FILE_PORTABLE_DEVICE 0x00004000
#define FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL 0x00020000 #define FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL 0x00020000
typedef struct {
__le32 DeviceType;
__le32 DeviceCharacteristics;
} __attribute__((packed)) FILE_SYSTEM_DEVICE_INFO; /* device info level 0x104 */
/* minimum includes first three fields, and empty FS Name */ /* minimum includes first three fields, and empty FS Name */
#define MIN_FS_ATTR_INFO_SIZE 12 #define MIN_FS_ATTR_INFO_SIZE 12
@ -2332,70 +2305,6 @@ typedef struct {
}; };
} __attribute__((packed)) FILE_UNIX_INFO; /* level 0x202 */ } __attribute__((packed)) FILE_UNIX_INFO; /* level 0x202 */
typedef struct {
__le32 NextEntryOffset;
__u32 FileIndex;
__le64 CreationTime;
__le64 LastAccessTime;
__le64 LastWriteTime;
__le64 ChangeTime;
__le64 EndOfFile;
__le64 AllocationSize;
__le32 ExtFileAttributes;
__le32 FileNameLength;
char FileName[];
} __attribute__((packed)) FILE_DIRECTORY_INFO; /* level 0x101 FF resp data */
typedef struct {
__le32 NextEntryOffset;
__u32 FileIndex;
__le64 CreationTime;
__le64 LastAccessTime;
__le64 LastWriteTime;
__le64 ChangeTime;
__le64 EndOfFile;
__le64 AllocationSize;
__le32 ExtFileAttributes;
__le32 FileNameLength;
__le32 EaSize; /* length of the xattrs */
char FileName[];
} __attribute__((packed)) FILE_FULL_DIRECTORY_INFO; /* level 0x102 rsp data */
typedef struct {
__le32 NextEntryOffset;
__u32 FileIndex;
__le64 CreationTime;
__le64 LastAccessTime;
__le64 LastWriteTime;
__le64 ChangeTime;
__le64 EndOfFile;
__le64 AllocationSize;
__le32 ExtFileAttributes;
__le32 FileNameLength;
__le32 EaSize; /* EA size */
__le32 Reserved;
__le64 UniqueId; /* inode num - le since Samba puts ino in low 32 bit*/
char FileName[];
} __attribute__((packed)) SEARCH_ID_FULL_DIR_INFO; /* level 0x105 FF rsp data */
typedef struct {
__le32 NextEntryOffset;
__u32 FileIndex;
__le64 CreationTime;
__le64 LastAccessTime;
__le64 LastWriteTime;
__le64 ChangeTime;
__le64 EndOfFile;
__le64 AllocationSize;
__le32 ExtFileAttributes;
__le32 FileNameLength;
__le32 EaSize; /* length of the xattrs */
__u8 ShortNameLength;
__u8 Reserved;
__u8 ShortName[24];
char FileName[];
} __attribute__((packed)) FILE_BOTH_DIRECTORY_INFO; /* level 0x104 FFrsp data */
typedef struct { typedef struct {
__u32 ResumeKey; __u32 ResumeKey;
__le16 CreationDate; /* SMB Date */ __le16 CreationDate; /* SMB Date */

View File

@ -1328,7 +1328,7 @@ static int cifs_get_fattr(struct cifs_open_info_data *data,
/* for easier reading */ /* for easier reading */
FILE_ALL_INFO *fi; FILE_ALL_INFO *fi;
FILE_DIRECTORY_INFO *fdi; FILE_DIRECTORY_INFO *fdi;
SEARCH_ID_FULL_DIR_INFO *si; FILE_ID_FULL_DIR_INFO *si;
rc = cifs_backup_query_path_info(xid, tcon, sb, rc = cifs_backup_query_path_info(xid, tcon, sb,
full_path, full_path,
@ -1339,7 +1339,7 @@ static int cifs_get_fattr(struct cifs_open_info_data *data,
move_cifs_info_to_smb2(&data->fi, fi); move_cifs_info_to_smb2(&data->fi, fi);
fdi = (FILE_DIRECTORY_INFO *)fi; fdi = (FILE_DIRECTORY_INFO *)fi;
si = (SEARCH_ID_FULL_DIR_INFO *)fi; si = (FILE_ID_FULL_DIR_INFO *)fi;
cifs_dir_info_to_fattr(fattr, fdi, cifs_sb); cifs_dir_info_to_fattr(fattr, fdi, cifs_sb);
fattr->cf_uniqueid = le64_to_cpu(si->UniqueId); fattr->cf_uniqueid = le64_to_cpu(si->UniqueId);

View File

@ -548,7 +548,7 @@ static void cifs_fill_dirent_full(struct cifs_dirent *de,
} }
static void cifs_fill_dirent_search(struct cifs_dirent *de, static void cifs_fill_dirent_search(struct cifs_dirent *de,
const SEARCH_ID_FULL_DIR_INFO *info) const FILE_ID_FULL_DIR_INFO *info)
{ {
de->name = &info->FileName[0]; de->name = &info->FileName[0];
de->namelen = le32_to_cpu(info->FileNameLength); de->namelen = le32_to_cpu(info->FileNameLength);

View File

@ -5454,7 +5454,7 @@ smb2_parse_query_directory(struct cifs_tcon *tcon,
info_buf_size = sizeof(FILE_DIRECTORY_INFO); info_buf_size = sizeof(FILE_DIRECTORY_INFO);
break; break;
case SMB_FIND_FILE_ID_FULL_DIR_INFO: case SMB_FIND_FILE_ID_FULL_DIR_INFO:
info_buf_size = sizeof(SEARCH_ID_FULL_DIR_INFO); info_buf_size = sizeof(FILE_ID_FULL_DIR_INFO);
break; break;
case SMB_FIND_FILE_POSIX_INFO: case SMB_FIND_FILE_POSIX_INFO:
/* note that posix payload are variable size */ /* note that posix payload are variable size */

View File

@ -224,19 +224,6 @@ struct smb2_file_reparse_point_info {
__le32 Tag; __le32 Tag;
} __packed; } __packed;
struct smb2_file_network_open_info {
struct_group_attr(network_open_info, __packed,
__le64 CreationTime;
__le64 LastAccessTime;
__le64 LastWriteTime;
__le64 ChangeTime;
__le64 AllocationSize;
__le64 EndOfFile;
__le32 Attributes;
);
__le32 Reserved;
} __packed; /* level 34 Query also similar returned in close rsp and open rsp */
/* See MS-FSCC 2.4.21 */ /* See MS-FSCC 2.4.21 */
struct smb2_file_id_information { struct smb2_file_id_information {
__le64 VolumeSerialNumber; __le64 VolumeSerialNumber;

View File

@ -12,6 +12,88 @@
#ifndef _COMMON_SMB_FSCC_H #ifndef _COMMON_SMB_FSCC_H
#define _COMMON_SMB_FSCC_H #define _COMMON_SMB_FSCC_H
/* See MS-FSCC 2.4.8 */
typedef struct {
__le32 NextEntryOffset;
__u32 FileIndex;
__le64 CreationTime;
__le64 LastAccessTime;
__le64 LastWriteTime;
__le64 ChangeTime;
__le64 EndOfFile;
__le64 AllocationSize;
__le32 ExtFileAttributes;
__le32 FileNameLength;
__le32 EaSize; /* length of the xattrs */
__u8 ShortNameLength;
__u8 Reserved;
__u8 ShortName[24];
char FileName[];
} __packed FILE_BOTH_DIRECTORY_INFO; /* level 0x104 FFrsp data */
/* See MS-FSCC 2.4.10 */
typedef struct {
__le32 NextEntryOffset;
__u32 FileIndex;
__le64 CreationTime;
__le64 LastAccessTime;
__le64 LastWriteTime;
__le64 ChangeTime;
__le64 EndOfFile;
__le64 AllocationSize;
__le32 ExtFileAttributes;
__le32 FileNameLength;
char FileName[];
} __packed FILE_DIRECTORY_INFO; /* level 0x101 FF resp data */
/* See MS-FSCC 2.4.14 */
typedef struct {
__le32 NextEntryOffset;
__u32 FileIndex;
__le64 CreationTime;
__le64 LastAccessTime;
__le64 LastWriteTime;
__le64 ChangeTime;
__le64 EndOfFile;
__le64 AllocationSize;
__le32 ExtFileAttributes;
__le32 FileNameLength;
__le32 EaSize; /* length of the xattrs */
char FileName[];
} __packed FILE_FULL_DIRECTORY_INFO; /* level 0x102 rsp data */
/* See MS-FSCC 2.4.24 */
typedef struct {
__le32 NextEntryOffset;
__u32 FileIndex;
__le64 CreationTime;
__le64 LastAccessTime;
__le64 LastWriteTime;
__le64 ChangeTime;
__le64 EndOfFile;
__le64 AllocationSize;
__le32 ExtFileAttributes;
__le32 FileNameLength;
__le32 EaSize; /* EA size */
__le32 Reserved;
__le64 UniqueId; /* inode num - le since Samba puts ino in low 32 bit*/
char FileName[];
} __packed FILE_ID_FULL_DIR_INFO; /* level 0x105 FF rsp data */
/* See MS-FSCC 2.4.34 */
struct smb2_file_network_open_info {
struct_group_attr(network_open_info, __packed,
__le64 CreationTime;
__le64 LastAccessTime;
__le64 LastWriteTime;
__le64 ChangeTime;
__le64 AllocationSize;
__le64 EndOfFile;
__le32 Attributes;
);
__le32 Reserved;
} __packed; /* level 34 Query also similar returned in close rsp and open rsp */
/* List of FileSystemAttributes - see MS-FSCC 2.5.1 */ /* List of FileSystemAttributes - see MS-FSCC 2.5.1 */
#define FILE_SUPPORTS_SPARSE_VDL 0x10000000 /* faster nonsparse extend */ #define FILE_SUPPORTS_SPARSE_VDL 0x10000000 /* faster nonsparse extend */
#define FILE_SUPPORTS_BLOCK_REFCOUNTING 0x08000000 /* allow ioctl dup extents */ #define FILE_SUPPORTS_BLOCK_REFCOUNTING 0x08000000 /* allow ioctl dup extents */
@ -39,4 +121,37 @@
#define FILE_CASE_PRESERVED_NAMES 0x00000002 #define FILE_CASE_PRESERVED_NAMES 0x00000002
#define FILE_CASE_SENSITIVE_SEARCH 0x00000001 #define FILE_CASE_SENSITIVE_SEARCH 0x00000001
/* See MS-FSCC 2.5.10 */
typedef struct {
__le32 DeviceType;
__le32 DeviceCharacteristics;
} __packed FILE_SYSTEM_DEVICE_INFO; /* device info level 0x104 */
/*
* See POSIX Extensions to MS-FSCC 2.3.2.1
* Link: https://gitlab.com/samba-team/smb3-posix-spec/-/blob/master/fscc_posix_extensions.md
*/
typedef struct {
/* For undefined recommended transfer size return -1 in that field */
__le32 OptimalTransferSize; /* bsize on some os, iosize on other os */
__le32 BlockSize;
/* The next three fields are in terms of the block size.
* (above). If block size is unknown, 4096 would be a
* reasonable block size for a server to report.
* Note that returning the blocks/blocksavail removes need
* to make a second call (to QFSInfo level 0x103 to get this info.
* UserBlockAvail is typically less than or equal to BlocksAvail,
* if no distinction is made return the same value in each
*/
__le64 TotalBlocks;
__le64 BlocksAvail; /* bfree */
__le64 UserBlocksAvail; /* bavail */
/* For undefined Node fields or FSID return -1 */
__le64 TotalFileNodes;
__le64 FreeFileNodes;
__le64 FileSysIdentifier; /* fsid */
/* NB Namelen comes from FILE_SYSTEM_ATTRIBUTE_INFO call */
/* NB flags can come from FILE_SYSTEM_DEVICE_INFO call */
} __packed FILE_SYSTEM_POSIX_INFO;
#endif /* _COMMON_SMB_FSCC_H */ #endif /* _COMMON_SMB_FSCC_H */

View File

@ -3786,15 +3786,15 @@ static int readdir_info_level_struct_sz(int info_level)
{ {
switch (info_level) { switch (info_level) {
case FILE_FULL_DIRECTORY_INFORMATION: case FILE_FULL_DIRECTORY_INFORMATION:
return sizeof(struct file_full_directory_info); return sizeof(FILE_FULL_DIRECTORY_INFO);
case FILE_BOTH_DIRECTORY_INFORMATION: case FILE_BOTH_DIRECTORY_INFORMATION:
return sizeof(struct file_both_directory_info); return sizeof(FILE_BOTH_DIRECTORY_INFO);
case FILE_DIRECTORY_INFORMATION: case FILE_DIRECTORY_INFORMATION:
return sizeof(struct file_directory_info); return sizeof(FILE_DIRECTORY_INFO);
case FILE_NAMES_INFORMATION: case FILE_NAMES_INFORMATION:
return sizeof(struct file_names_info); return sizeof(struct file_names_info);
case FILEID_FULL_DIRECTORY_INFORMATION: case FILEID_FULL_DIRECTORY_INFORMATION:
return sizeof(struct file_id_full_dir_info); return sizeof(FILE_ID_FULL_DIR_INFO);
case FILEID_BOTH_DIRECTORY_INFORMATION: case FILEID_BOTH_DIRECTORY_INFORMATION:
return sizeof(struct file_id_both_directory_info); return sizeof(struct file_id_both_directory_info);
case SMB_FIND_FILE_POSIX_INFO: case SMB_FIND_FILE_POSIX_INFO:
@ -3809,9 +3809,9 @@ static int dentry_name(struct ksmbd_dir_info *d_info, int info_level)
switch (info_level) { switch (info_level) {
case FILE_FULL_DIRECTORY_INFORMATION: case FILE_FULL_DIRECTORY_INFORMATION:
{ {
struct file_full_directory_info *ffdinfo; FILE_FULL_DIRECTORY_INFO *ffdinfo;
ffdinfo = (struct file_full_directory_info *)d_info->rptr; ffdinfo = (FILE_FULL_DIRECTORY_INFO *)d_info->rptr;
d_info->rptr += le32_to_cpu(ffdinfo->NextEntryOffset); d_info->rptr += le32_to_cpu(ffdinfo->NextEntryOffset);
d_info->name = ffdinfo->FileName; d_info->name = ffdinfo->FileName;
d_info->name_len = le32_to_cpu(ffdinfo->FileNameLength); d_info->name_len = le32_to_cpu(ffdinfo->FileNameLength);
@ -3819,9 +3819,9 @@ static int dentry_name(struct ksmbd_dir_info *d_info, int info_level)
} }
case FILE_BOTH_DIRECTORY_INFORMATION: case FILE_BOTH_DIRECTORY_INFORMATION:
{ {
struct file_both_directory_info *fbdinfo; FILE_BOTH_DIRECTORY_INFO *fbdinfo;
fbdinfo = (struct file_both_directory_info *)d_info->rptr; fbdinfo = (FILE_BOTH_DIRECTORY_INFO *)d_info->rptr;
d_info->rptr += le32_to_cpu(fbdinfo->NextEntryOffset); d_info->rptr += le32_to_cpu(fbdinfo->NextEntryOffset);
d_info->name = fbdinfo->FileName; d_info->name = fbdinfo->FileName;
d_info->name_len = le32_to_cpu(fbdinfo->FileNameLength); d_info->name_len = le32_to_cpu(fbdinfo->FileNameLength);
@ -3829,9 +3829,9 @@ static int dentry_name(struct ksmbd_dir_info *d_info, int info_level)
} }
case FILE_DIRECTORY_INFORMATION: case FILE_DIRECTORY_INFORMATION:
{ {
struct file_directory_info *fdinfo; FILE_DIRECTORY_INFO *fdinfo;
fdinfo = (struct file_directory_info *)d_info->rptr; fdinfo = (FILE_DIRECTORY_INFO *)d_info->rptr;
d_info->rptr += le32_to_cpu(fdinfo->NextEntryOffset); d_info->rptr += le32_to_cpu(fdinfo->NextEntryOffset);
d_info->name = fdinfo->FileName; d_info->name = fdinfo->FileName;
d_info->name_len = le32_to_cpu(fdinfo->FileNameLength); d_info->name_len = le32_to_cpu(fdinfo->FileNameLength);
@ -3849,9 +3849,9 @@ static int dentry_name(struct ksmbd_dir_info *d_info, int info_level)
} }
case FILEID_FULL_DIRECTORY_INFORMATION: case FILEID_FULL_DIRECTORY_INFORMATION:
{ {
struct file_id_full_dir_info *dinfo; FILE_ID_FULL_DIR_INFO *dinfo;
dinfo = (struct file_id_full_dir_info *)d_info->rptr; dinfo = (FILE_ID_FULL_DIR_INFO *)d_info->rptr;
d_info->rptr += le32_to_cpu(dinfo->NextEntryOffset); d_info->rptr += le32_to_cpu(dinfo->NextEntryOffset);
d_info->name = dinfo->FileName; d_info->name = dinfo->FileName;
d_info->name_len = le32_to_cpu(dinfo->FileNameLength); d_info->name_len = le32_to_cpu(dinfo->FileNameLength);
@ -3934,9 +3934,9 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
switch (info_level) { switch (info_level) {
case FILE_FULL_DIRECTORY_INFORMATION: case FILE_FULL_DIRECTORY_INFORMATION:
{ {
struct file_full_directory_info *ffdinfo; FILE_FULL_DIRECTORY_INFO *ffdinfo;
ffdinfo = (struct file_full_directory_info *)kstat; ffdinfo = (FILE_FULL_DIRECTORY_INFO *)kstat;
ffdinfo->FileNameLength = cpu_to_le32(conv_len); ffdinfo->FileNameLength = cpu_to_le32(conv_len);
ffdinfo->EaSize = ffdinfo->EaSize =
smb2_get_reparse_tag_special_file(ksmbd_kstat->kstat->mode); smb2_get_reparse_tag_special_file(ksmbd_kstat->kstat->mode);
@ -3950,9 +3950,9 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
} }
case FILE_BOTH_DIRECTORY_INFORMATION: case FILE_BOTH_DIRECTORY_INFORMATION:
{ {
struct file_both_directory_info *fbdinfo; FILE_BOTH_DIRECTORY_INFO *fbdinfo;
fbdinfo = (struct file_both_directory_info *)kstat; fbdinfo = (FILE_BOTH_DIRECTORY_INFO *)kstat;
fbdinfo->FileNameLength = cpu_to_le32(conv_len); fbdinfo->FileNameLength = cpu_to_le32(conv_len);
fbdinfo->EaSize = fbdinfo->EaSize =
smb2_get_reparse_tag_special_file(ksmbd_kstat->kstat->mode); smb2_get_reparse_tag_special_file(ksmbd_kstat->kstat->mode);
@ -3968,9 +3968,9 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
} }
case FILE_DIRECTORY_INFORMATION: case FILE_DIRECTORY_INFORMATION:
{ {
struct file_directory_info *fdinfo; FILE_DIRECTORY_INFO *fdinfo;
fdinfo = (struct file_directory_info *)kstat; fdinfo = (FILE_DIRECTORY_INFO *)kstat;
fdinfo->FileNameLength = cpu_to_le32(conv_len); fdinfo->FileNameLength = cpu_to_le32(conv_len);
if (d_info->hide_dot_file && d_info->name[0] == '.') if (d_info->hide_dot_file && d_info->name[0] == '.')
fdinfo->ExtFileAttributes |= FILE_ATTRIBUTE_HIDDEN_LE; fdinfo->ExtFileAttributes |= FILE_ATTRIBUTE_HIDDEN_LE;
@ -3990,9 +3990,9 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
} }
case FILEID_FULL_DIRECTORY_INFORMATION: case FILEID_FULL_DIRECTORY_INFORMATION:
{ {
struct file_id_full_dir_info *dinfo; FILE_ID_FULL_DIR_INFO *dinfo;
dinfo = (struct file_id_full_dir_info *)kstat; dinfo = (FILE_ID_FULL_DIR_INFO *)kstat;
dinfo->FileNameLength = cpu_to_le32(conv_len); dinfo->FileNameLength = cpu_to_le32(conv_len);
dinfo->EaSize = dinfo->EaSize =
smb2_get_reparse_tag_special_file(ksmbd_kstat->kstat->mode); smb2_get_reparse_tag_special_file(ksmbd_kstat->kstat->mode);
@ -4196,9 +4196,9 @@ static int reserve_populate_dentry(struct ksmbd_dir_info *d_info,
switch (info_level) { switch (info_level) {
case FILE_FULL_DIRECTORY_INFORMATION: case FILE_FULL_DIRECTORY_INFORMATION:
{ {
struct file_full_directory_info *ffdinfo; FILE_FULL_DIRECTORY_INFO *ffdinfo;
ffdinfo = (struct file_full_directory_info *)d_info->wptr; ffdinfo = (FILE_FULL_DIRECTORY_INFO *)d_info->wptr;
memcpy(ffdinfo->FileName, d_info->name, d_info->name_len); memcpy(ffdinfo->FileName, d_info->name, d_info->name_len);
ffdinfo->FileName[d_info->name_len] = 0x00; ffdinfo->FileName[d_info->name_len] = 0x00;
ffdinfo->FileNameLength = cpu_to_le32(d_info->name_len); ffdinfo->FileNameLength = cpu_to_le32(d_info->name_len);
@ -4207,9 +4207,9 @@ static int reserve_populate_dentry(struct ksmbd_dir_info *d_info,
} }
case FILE_BOTH_DIRECTORY_INFORMATION: case FILE_BOTH_DIRECTORY_INFORMATION:
{ {
struct file_both_directory_info *fbdinfo; FILE_BOTH_DIRECTORY_INFO *fbdinfo;
fbdinfo = (struct file_both_directory_info *)d_info->wptr; fbdinfo = (FILE_BOTH_DIRECTORY_INFO *)d_info->wptr;
memcpy(fbdinfo->FileName, d_info->name, d_info->name_len); memcpy(fbdinfo->FileName, d_info->name, d_info->name_len);
fbdinfo->FileName[d_info->name_len] = 0x00; fbdinfo->FileName[d_info->name_len] = 0x00;
fbdinfo->FileNameLength = cpu_to_le32(d_info->name_len); fbdinfo->FileNameLength = cpu_to_le32(d_info->name_len);
@ -4218,9 +4218,9 @@ static int reserve_populate_dentry(struct ksmbd_dir_info *d_info,
} }
case FILE_DIRECTORY_INFORMATION: case FILE_DIRECTORY_INFORMATION:
{ {
struct file_directory_info *fdinfo; FILE_DIRECTORY_INFO *fdinfo;
fdinfo = (struct file_directory_info *)d_info->wptr; fdinfo = (FILE_DIRECTORY_INFO *)d_info->wptr;
memcpy(fdinfo->FileName, d_info->name, d_info->name_len); memcpy(fdinfo->FileName, d_info->name, d_info->name_len);
fdinfo->FileName[d_info->name_len] = 0x00; fdinfo->FileName[d_info->name_len] = 0x00;
fdinfo->FileNameLength = cpu_to_le32(d_info->name_len); fdinfo->FileNameLength = cpu_to_le32(d_info->name_len);
@ -4240,9 +4240,9 @@ static int reserve_populate_dentry(struct ksmbd_dir_info *d_info,
} }
case FILEID_FULL_DIRECTORY_INFORMATION: case FILEID_FULL_DIRECTORY_INFORMATION:
{ {
struct file_id_full_dir_info *dinfo; FILE_ID_FULL_DIR_INFO *dinfo;
dinfo = (struct file_id_full_dir_info *)d_info->wptr; dinfo = (FILE_ID_FULL_DIR_INFO *)d_info->wptr;
memcpy(dinfo->FileName, d_info->name, d_info->name_len); memcpy(dinfo->FileName, d_info->name, d_info->name_len);
dinfo->FileName[d_info->name_len] = 0x00; dinfo->FileName[d_info->name_len] = 0x00;
dinfo->FileNameLength = cpu_to_le32(d_info->name_len); dinfo->FileNameLength = cpu_to_le32(d_info->name_len);
@ -4504,7 +4504,7 @@ int smb2_query_dir(struct ksmbd_work *work)
goto err_out; goto err_out;
} else { } else {
no_buf_len: no_buf_len:
((struct file_directory_info *) ((FILE_DIRECTORY_INFO *)
((char *)rsp->Buffer + d_info.last_entry_offset)) ((char *)rsp->Buffer + d_info.last_entry_offset))
->NextEntryOffset = 0; ->NextEntryOffset = 0;
if (d_info.data_count >= d_info.last_entry_off_align) if (d_info.data_count >= d_info.last_entry_off_align)
@ -5123,7 +5123,7 @@ static int get_file_internal_info(struct smb2_query_info_rsp *rsp,
static int get_file_network_open_info(struct smb2_query_info_rsp *rsp, static int get_file_network_open_info(struct smb2_query_info_rsp *rsp,
struct ksmbd_file *fp, void *rsp_org) struct ksmbd_file *fp, void *rsp_org)
{ {
struct smb2_file_ntwrk_info *file_info; struct smb2_file_network_open_info *file_info;
struct kstat stat; struct kstat stat;
u64 time; u64 time;
int ret; int ret;
@ -5139,7 +5139,7 @@ static int get_file_network_open_info(struct smb2_query_info_rsp *rsp,
if (ret) if (ret)
return ret; return ret;
file_info = (struct smb2_file_ntwrk_info *)rsp->Buffer; file_info = (struct smb2_file_network_open_info *)rsp->Buffer;
file_info->CreationTime = cpu_to_le64(fp->create_time); file_info->CreationTime = cpu_to_le64(fp->create_time);
time = ksmbd_UnixTimeToNT(stat.atime); time = ksmbd_UnixTimeToNT(stat.atime);
@ -5158,7 +5158,7 @@ static int get_file_network_open_info(struct smb2_query_info_rsp *rsp,
} }
file_info->Reserved = cpu_to_le32(0); file_info->Reserved = cpu_to_le32(0);
rsp->OutputBufferLength = rsp->OutputBufferLength =
cpu_to_le32(sizeof(struct smb2_file_ntwrk_info)); cpu_to_le32(sizeof(struct smb2_file_network_open_info));
return 0; return 0;
} }
@ -5466,9 +5466,9 @@ static int smb2_get_info_filesystem(struct ksmbd_work *work,
switch (fsinfoclass) { switch (fsinfoclass) {
case FS_DEVICE_INFORMATION: case FS_DEVICE_INFORMATION:
{ {
struct filesystem_device_info *info; FILE_SYSTEM_DEVICE_INFO *info;
info = (struct filesystem_device_info *)rsp->Buffer; info = (FILE_SYSTEM_DEVICE_INFO *)rsp->Buffer;
info->DeviceType = cpu_to_le32(FILE_DEVICE_DISK); info->DeviceType = cpu_to_le32(FILE_DEVICE_DISK);
info->DeviceCharacteristics = info->DeviceCharacteristics =
@ -5623,14 +5623,14 @@ static int smb2_get_info_filesystem(struct ksmbd_work *work,
} }
case FS_POSIX_INFORMATION: case FS_POSIX_INFORMATION:
{ {
struct filesystem_posix_info *info; FILE_SYSTEM_POSIX_INFO *info;
if (!work->tcon->posix_extensions) { if (!work->tcon->posix_extensions) {
pr_err("client doesn't negotiate with SMB3.1.1 POSIX Extensions\n"); pr_err("client doesn't negotiate with SMB3.1.1 POSIX Extensions\n");
path_put(&path); path_put(&path);
return -EOPNOTSUPP; return -EOPNOTSUPP;
} else { } else {
info = (struct filesystem_posix_info *)(rsp->Buffer); info = (FILE_SYSTEM_POSIX_INFO *)(rsp->Buffer);
info->OptimalTransferSize = cpu_to_le32(stfs.f_bsize); info->OptimalTransferSize = cpu_to_le32(stfs.f_bsize);
info->BlockSize = cpu_to_le32(stfs.f_bsize); info->BlockSize = cpu_to_le32(stfs.f_bsize);
info->TotalBlocks = cpu_to_le64(stfs.f_blocks); info->TotalBlocks = cpu_to_le64(stfs.f_blocks);

View File

@ -217,17 +217,6 @@ struct smb2_file_stream_info {
char StreamName[]; char StreamName[];
} __packed; } __packed;
struct smb2_file_ntwrk_info {
__le64 CreationTime;
__le64 LastAccessTime;
__le64 LastWriteTime;
__le64 ChangeTime;
__le64 AllocationSize;
__le64 EndOfFile;
__le32 Attributes;
__le32 Reserved;
} __packed;
struct smb2_file_standard_info { struct smb2_file_standard_info {
__le64 AllocationSize; __le64 AllocationSize;
__le64 EndOfFile; __le64 EndOfFile;

View File

@ -104,11 +104,6 @@ struct filesystem_attribute_info {
__le16 FileSystemName[]; /* do not have to save this - get subset? */ __le16 FileSystemName[]; /* do not have to save this - get subset? */
} __packed; } __packed;
struct filesystem_device_info {
__le32 DeviceType;
__le32 DeviceCharacteristics;
} __packed; /* device info level 0x104 */
struct filesystem_vol_info { struct filesystem_vol_info {
__le64 VolumeCreationTime; __le64 VolumeCreationTime;
__le32 SerialNumber; __le32 SerialNumber;
@ -140,20 +135,6 @@ struct object_id_info {
struct fs_extended_info extended_info; struct fs_extended_info extended_info;
} __packed; } __packed;
struct file_directory_info {
__le32 NextEntryOffset;
__u32 FileIndex;
__le64 CreationTime;
__le64 LastAccessTime;
__le64 LastWriteTime;
__le64 ChangeTime;
__le64 EndOfFile;
__le64 AllocationSize;
__le32 ExtFileAttributes;
__le32 FileNameLength;
char FileName[];
} __packed; /* level 0x101 FF resp data */
struct file_names_info { struct file_names_info {
__le32 NextEntryOffset; __le32 NextEntryOffset;
__u32 FileIndex; __u32 FileIndex;
@ -161,39 +142,6 @@ struct file_names_info {
char FileName[]; char FileName[];
} __packed; /* level 0xc FF resp data */ } __packed; /* level 0xc FF resp data */
struct file_full_directory_info {
__le32 NextEntryOffset;
__u32 FileIndex;
__le64 CreationTime;
__le64 LastAccessTime;
__le64 LastWriteTime;
__le64 ChangeTime;
__le64 EndOfFile;
__le64 AllocationSize;
__le32 ExtFileAttributes;
__le32 FileNameLength;
__le32 EaSize;
char FileName[];
} __packed; /* level 0x102 FF resp */
struct file_both_directory_info {
__le32 NextEntryOffset;
__u32 FileIndex;
__le64 CreationTime;
__le64 LastAccessTime;
__le64 LastWriteTime;
__le64 ChangeTime;
__le64 EndOfFile;
__le64 AllocationSize;
__le32 ExtFileAttributes;
__le32 FileNameLength;
__le32 EaSize; /* length of the xattrs */
__u8 ShortNameLength;
__u8 Reserved;
__u8 ShortName[24];
char FileName[];
} __packed; /* level 0x104 FFrsp data */
struct file_id_both_directory_info { struct file_id_both_directory_info {
__le32 NextEntryOffset; __le32 NextEntryOffset;
__u32 FileIndex; __u32 FileIndex;
@ -214,46 +162,6 @@ struct file_id_both_directory_info {
char FileName[]; char FileName[];
} __packed; } __packed;
struct file_id_full_dir_info {
__le32 NextEntryOffset;
__u32 FileIndex;
__le64 CreationTime;
__le64 LastAccessTime;
__le64 LastWriteTime;
__le64 ChangeTime;
__le64 EndOfFile;
__le64 AllocationSize;
__le32 ExtFileAttributes;
__le32 FileNameLength;
__le32 EaSize; /* EA size */
__le32 Reserved;
__le64 UniqueId; /* inode num - le since Samba puts ino in low 32 bit*/
char FileName[];
} __packed; /* level 0x105 FF rsp data */
struct filesystem_posix_info {
/* For undefined recommended transfer size return -1 in that field */
__le32 OptimalTransferSize; /* bsize on some os, iosize on other os */
__le32 BlockSize;
/* The next three fields are in terms of the block size.
* (above). If block size is unknown, 4096 would be a
* reasonable block size for a server to report.
* Note that returning the blocks/blocksavail removes need
* to make a second call (to QFSInfo level 0x103 to get this info.
* UserBlockAvail is typically less than or equal to BlocksAvail,
* if no distinction is made return the same value in each
*/
__le64 TotalBlocks;
__le64 BlocksAvail; /* bfree */
__le64 UserBlocksAvail; /* bavail */
/* For undefined Node fields or FSID return -1 */
__le64 TotalFileNodes;
__le64 FreeFileNodes;
__le64 FileSysIdentifier; /* fsid */
/* NB Namelen comes from FILE_SYSTEM_ATTRIBUTE_INFO call */
/* NB flags can come from FILE_SYSTEM_DEVICE_INFO call */
} __packed;
struct smb_version_ops { struct smb_version_ops {
u16 (*get_cmd_val)(struct ksmbd_work *swork); u16 (*get_cmd_val)(struct ksmbd_work *swork);
int (*init_rsp_hdr)(struct ksmbd_work *swork); int (*init_rsp_hdr)(struct ksmbd_work *swork);

View File

@ -1657,7 +1657,7 @@ int ksmbd_vfs_get_dos_attrib_xattr(struct mnt_idmap *idmap,
*/ */
void *ksmbd_vfs_init_kstat(char **p, struct ksmbd_kstat *ksmbd_kstat) void *ksmbd_vfs_init_kstat(char **p, struct ksmbd_kstat *ksmbd_kstat)
{ {
struct file_directory_info *info = (struct file_directory_info *)(*p); FILE_DIRECTORY_INFO *info = (FILE_DIRECTORY_INFO *)(*p);
struct kstat *kstat = ksmbd_kstat->kstat; struct kstat *kstat = ksmbd_kstat->kstat;
u64 time; u64 time;