From: Namjae Jeon <linkinjeon@kernel.org>
To: linux-cifs@vger.kernel.org
Cc: senozhatsky@chromium.org, tom@talpey.com,
atteh.mailbox@gmail.com, chenxiaosong@chenxiaosong.com,
chenxiaosong@kylinos.cn, Namjae Jeon <linkinjeon@kernel.org>
Subject: [PATCH] ksmbd: support FileId64ExtdDirectoryInformation
Date: Sat, 17 Oct 2026 10:19:30 +0900 [thread overview]
Message-ID: <20261017011932.14912-3-linkinjeon@kernel.org> (raw)
In-Reply-To: <20261017011932.14912-1-linkinjeon@kernel.org>
Handle FileId64ExtdDirectoryInformation (0x4e) in SMB2 QUERY_DIRECTORY.
Add the packed wire layout specified by MS-FSCC 2.4.19 and support
this class in entry reservation, filename lookup and response encoding.
Use the VFS inode number for the 64-bit file ID and retain the existing
Apple extension behavior of returning a zero ID. Report reparse tags
separately from the EA size, set the reparse flag without changing other
file attributes, and initialize entry padding.
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
---
fs/smb/server/smb2pdu.c | 46 ++++++++++++++++++++++++++++++++++++++
fs/smb/server/smb_common.h | 18 +++++++++++++++
2 files changed, 64 insertions(+)
diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c
index e1e884f62f2b..13fc73e38f55 100644
--- a/fs/smb/server/smb2pdu.c
+++ b/fs/smb/server/smb2pdu.c
@@ -5446,6 +5446,8 @@ static int readdir_info_level_struct_sz(int info_level)
return sizeof(struct file_id_both_directory_info);
case FILE_ID_EXTD_DIRECTORY_INFORMATION:
return sizeof(struct file_id_extd_directory_info);
+ case FileId64ExtdDirectoryInformation:
+ return sizeof(struct file_id_64_extd_directory_info);
case FileIdAllExtdBothDirectoryInformation:
return sizeof(struct file_id_all_extd_both_directory_info);
case SMB_FIND_FILE_POSIX_INFO:
@@ -5528,6 +5530,16 @@ static int dentry_name(struct ksmbd_dir_info *d_info, int info_level)
d_info->name_len = le32_to_cpu(info->FileNameLength);
return 0;
}
+ case FileId64ExtdDirectoryInformation:
+ {
+ struct file_id_64_extd_directory_info *info;
+
+ info = (struct file_id_64_extd_directory_info *)d_info->rptr;
+ d_info->rptr += le32_to_cpu(info->NextEntryOffset);
+ d_info->name = info->FileName;
+ d_info->name_len = le32_to_cpu(info->FileNameLength);
+ return 0;
+ }
case FileIdAllExtdBothDirectoryInformation:
{
struct file_id_all_extd_both_directory_info *info;
@@ -5795,6 +5807,28 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
info->NextEntryOffset = cpu_to_le32(next_entry_offset);
break;
}
+ case FileId64ExtdDirectoryInformation:
+ {
+ struct file_id_64_extd_directory_info *info;
+
+ info = (struct file_id_64_extd_directory_info *)kstat;
+ info->FileNameLength = cpu_to_le32(conv_len);
+ info->EaSize = 0;
+ info->ReparsePointTag =
+ smb2_get_reparse_tag_special_file(ksmbd_kstat->kstat->mode);
+ if (info->ReparsePointTag)
+ info->ExtFileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT_LE;
+ if (conn->is_aapl)
+ info->FileId = 0;
+ else
+ info->FileId = cpu_to_le64(ksmbd_kstat->kstat->ino);
+ if (d_info->hide_dot_file && d_info->name[0] == '.')
+ info->ExtFileAttributes |= FILE_ATTRIBUTE_HIDDEN_LE;
+ memcpy(info->FileName, conv_name, conv_len);
+ memset(info->FileName + conv_len, 0, d_info->last_entry_off_align);
+ info->NextEntryOffset = cpu_to_le32(next_entry_offset);
+ break;
+ }
case FileIdAllExtdBothDirectoryInformation:
{
struct file_id_all_extd_both_directory_info *info;
@@ -6079,6 +6113,17 @@ static int reserve_populate_dentry(struct ksmbd_dir_info *d_info,
info->NextEntryOffset = cpu_to_le32(next_entry_offset);
break;
}
+ case FileId64ExtdDirectoryInformation:
+ {
+ struct file_id_64_extd_directory_info *info;
+
+ info = (struct file_id_64_extd_directory_info *)d_info->wptr;
+ memcpy(info->FileName, d_info->name, d_info->name_len);
+ info->FileName[d_info->name_len] = 0x00;
+ info->FileNameLength = cpu_to_le32(d_info->name_len);
+ info->NextEntryOffset = cpu_to_le32(next_entry_offset);
+ break;
+ }
case FileIdAllExtdBothDirectoryInformation:
{
struct file_id_all_extd_both_directory_info *info;
@@ -6152,6 +6197,7 @@ static int verify_info_level(int info_level)
case FILEID_BOTH_DIRECTORY_INFORMATION:
case SMB_FIND_FILE_POSIX_INFO:
case FILE_ID_EXTD_DIRECTORY_INFORMATION:
+ case FileId64ExtdDirectoryInformation:
case FileIdAllExtdBothDirectoryInformation:
break;
default:
diff --git a/fs/smb/server/smb_common.h b/fs/smb/server/smb_common.h
index 458255684f6c..bfd0122d972c 100644
--- a/fs/smb/server/smb_common.h
+++ b/fs/smb/server/smb_common.h
@@ -151,6 +151,24 @@ struct file_id_extd_directory_info {
char FileName[];
} __packed;
+/* MS-FSCC 2.4.19 FileId64ExtdDirectoryInformation */
+struct file_id_64_extd_directory_info {
+ __le32 NextEntryOffset;
+ __u32 FileIndex;
+ __le64 CreationTime;
+ __le64 LastAccessTime;
+ __le64 LastWriteTime;
+ __le64 ChangeTime;
+ __le64 EndOfFile;
+ __le64 AllocationSize;
+ __le32 ExtFileAttributes;
+ __le32 FileNameLength;
+ __le32 EaSize;
+ __le32 ReparsePointTag;
+ __le64 FileId;
+ char FileName[];
+} __packed;
+
/* MS-FSCC 2.4.20 FileIdAllExtdBothDirectoryInformation */
struct file_id_all_extd_both_directory_info {
__le32 NextEntryOffset;
--
2.25.1
next prev parent reply other threads:[~2026-10-17 1:19 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-17 1:19 [PATCH] ksmbd: support FileIdAllExtdBothDirectoryInformation Namjae Jeon
2026-10-17 1:19 ` [PATCH] ksmbd: support FileIdExtdDirectoryInformation Namjae Jeon
2026-10-17 1:19 ` Namjae Jeon [this message]
2026-10-17 1:19 ` [PATCH] ksmbd: support FileId64ExtdBothDirectoryInformation Namjae Jeon
2026-10-17 1:19 ` [PATCH] ksmbd: support FileIdAllExtdDirectoryInformation Namjae Jeon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261017011932.14912-3-linkinjeon@kernel.org \
--to=linkinjeon@kernel.org \
--cc=atteh.mailbox@gmail.com \
--cc=chenxiaosong@chenxiaosong.com \
--cc=chenxiaosong@kylinos.cn \
--cc=linux-cifs@vger.kernel.org \
--cc=senozhatsky@chromium.org \
--cc=tom@talpey.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox