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 FileIdAllExtdDirectoryInformation
Date: Sat, 17 Oct 2026 10:19:32 +0900 [thread overview]
Message-ID: <20261017011932.14912-5-linkinjeon@kernel.org> (raw)
In-Reply-To: <20261017011932.14912-1-linkinjeon@kernel.org>
Handle FileIdAllExtdDirectoryInformation (0x50) in SMB2 QUERY_DIRECTORY.
Add the packed wire layout specified by MS-FSCC 2.4.21 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. Zero the 128-bit file
ID because the VFS provides only a 64-bit inode number, as permitted by
the specification. 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 | 48 ++++++++++++++++++++++++++++++++++++++
fs/smb/server/smb_common.h | 19 +++++++++++++++
2 files changed, 67 insertions(+)
diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c
index 2c0378d306a8..32fd06171cdd 100644
--- a/fs/smb/server/smb2pdu.c
+++ b/fs/smb/server/smb2pdu.c
@@ -5450,6 +5450,8 @@ static int readdir_info_level_struct_sz(int info_level)
return sizeof(struct file_id_64_extd_directory_info);
case FileId64ExtdBothDirectoryInformation:
return sizeof(struct file_id_64_extd_both_directory_info);
+ case FileIdAllExtdDirectoryInformation:
+ return sizeof(struct file_id_all_extd_directory_info);
case FileIdAllExtdBothDirectoryInformation:
return sizeof(struct file_id_all_extd_both_directory_info);
case SMB_FIND_FILE_POSIX_INFO:
@@ -5552,6 +5554,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 FileIdAllExtdDirectoryInformation:
+ {
+ struct file_id_all_extd_directory_info *info;
+
+ info = (struct file_id_all_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;
@@ -5866,6 +5878,30 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
info->NextEntryOffset = cpu_to_le32(next_entry_offset);
break;
}
+ case FileIdAllExtdDirectoryInformation:
+ {
+ struct file_id_all_extd_directory_info *info;
+
+ info = (struct file_id_all_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);
+ /* The VFS does not provide a 128-bit file ID. */
+ memset(info->FileId128, 0, sizeof(info->FileId128));
+ 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;
@@ -6172,6 +6208,17 @@ static int reserve_populate_dentry(struct ksmbd_dir_info *d_info,
info->NextEntryOffset = cpu_to_le32(next_entry_offset);
break;
}
+ case FileIdAllExtdDirectoryInformation:
+ {
+ struct file_id_all_extd_directory_info *info;
+
+ info = (struct file_id_all_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;
@@ -6247,6 +6294,7 @@ static int verify_info_level(int info_level)
case FILE_ID_EXTD_DIRECTORY_INFORMATION:
case FileId64ExtdDirectoryInformation:
case FileId64ExtdBothDirectoryInformation:
+ case FileIdAllExtdDirectoryInformation:
case FileIdAllExtdBothDirectoryInformation:
break;
default:
diff --git a/fs/smb/server/smb_common.h b/fs/smb/server/smb_common.h
index 571b0e9e35d2..a9cc09e31721 100644
--- a/fs/smb/server/smb_common.h
+++ b/fs/smb/server/smb_common.h
@@ -190,6 +190,25 @@ struct file_id_64_extd_both_directory_info {
char FileName[];
} __packed;
+/* MS-FSCC 2.4.21 FileIdAllExtdDirectoryInformation */
+struct file_id_all_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;
+ __u8 FileId128[16];
+ char FileName[];
+} __packed;
+
/* MS-FSCC 2.4.20 FileIdAllExtdBothDirectoryInformation */
struct file_id_all_extd_both_directory_info {
__le32 NextEntryOffset;
--
2.25.1
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 ` [PATCH] ksmbd: support FileId64ExtdDirectoryInformation Namjae Jeon
2026-10-17 1:19 ` [PATCH] ksmbd: support FileId64ExtdBothDirectoryInformation Namjae Jeon
2026-10-17 1:19 ` Namjae Jeon [this message]
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-5-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