diff options
| author | Namjae Jeon <linkinjeon@kernel.org> | 2026-07-05 16:01:27 +0900 |
|---|---|---|
| committer | Steve French <stfrench@microsoft.com> | 2026-07-26 17:44:25 -0500 |
| commit | ac607d1f55b1ca1a8a812e0bca5df1c7b18b3114 (patch) | |
| tree | c9bc7aa65d4c282b4a0b314844af25750c3e64ea /fs/smb/server | |
| parent | 6b2fa27c9523fc36abea4f419331976ca270dfed (diff) | |
| download | linux-next-ac607d1f55b1ca1a8a812e0bca5df1c7b18b3114.tar.gz linux-next-ac607d1f55b1ca1a8a812e0bca5df1c7b18b3114.zip | |
ksmbd: allow I/O on directory named streams
Named streams are stored as extended attributes on the base inode. The
VFS read and write helpers reject directory inodes before or together
with checking whether the handle represents a stream.
Permit read and write operations when a directory-backed handle is a
named stream. Continue rejecting direct I/O on ordinary directory
handles.
This fixes creation of the directory stream in smb2.getinfo.complex.
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
Diffstat (limited to 'fs/smb/server')
| -rw-r--r-- | fs/smb/server/vfs.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/fs/smb/server/vfs.c b/fs/smb/server/vfs.c index d324585c0566..86d9cda0ca9e 100644 --- a/fs/smb/server/vfs.c +++ b/fs/smb/server/vfs.c @@ -345,7 +345,7 @@ int ksmbd_vfs_read(struct ksmbd_work *work, struct ksmbd_file *fp, size_t count, ssize_t nbytes = 0; struct inode *inode = file_inode(filp); - if (S_ISDIR(inode->i_mode)) + if (S_ISDIR(inode->i_mode) && !ksmbd_stream_fd(fp)) return -EISDIR; if (unlikely(count == 0)) @@ -474,7 +474,8 @@ int ksmbd_vfs_write(struct ksmbd_work *work, struct ksmbd_file *fp, if (work->conn->connection_type) { if (!(fp->daccess & (FILE_WRITE_DATA_LE | FILE_APPEND_DATA_LE)) || - S_ISDIR(file_inode(fp->filp)->i_mode)) { + (S_ISDIR(file_inode(fp->filp)->i_mode) && + !ksmbd_stream_fd(fp))) { pr_err("no right to write(%pD)\n", fp->filp); err = -EACCES; goto out; |
