Commit 8e2f6a0e authored by Namjae Jeon's avatar Namjae Jeon Committed by Steve French

ksmbd: fix open failure from block and char device file

char/block device file can't be opened with dentry_open() if device driver
is not loaded. Use O_PATH flags for fake opening file to handle it if file
is a block or char file.
Signed-off-by: default avatarNamjae Jeon <linkinjeon@kernel.org>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent d782d6e1
...@@ -2052,18 +2052,20 @@ int smb2_tree_connect(struct ksmbd_work *work) ...@@ -2052,18 +2052,20 @@ int smb2_tree_connect(struct ksmbd_work *work)
* @access: file access flags * @access: file access flags
* @disposition: file disposition flags * @disposition: file disposition flags
* @may_flags: set with MAY_ flags * @may_flags: set with MAY_ flags
* @is_dir: is creating open flags for directory * @coptions: file creation options
* @mode: file mode
* *
* Return: file open flags * Return: file open flags
*/ */
static int smb2_create_open_flags(bool file_present, __le32 access, static int smb2_create_open_flags(bool file_present, __le32 access,
__le32 disposition, __le32 disposition,
int *may_flags, int *may_flags,
bool is_dir) __le32 coptions,
umode_t mode)
{ {
int oflags = O_NONBLOCK | O_LARGEFILE; int oflags = O_NONBLOCK | O_LARGEFILE;
if (is_dir) { if (coptions & FILE_DIRECTORY_FILE_LE || S_ISDIR(mode)) {
access &= ~FILE_WRITE_DESIRE_ACCESS_LE; access &= ~FILE_WRITE_DESIRE_ACCESS_LE;
ksmbd_debug(SMB, "Discard write access to a directory\n"); ksmbd_debug(SMB, "Discard write access to a directory\n");
} }
...@@ -2080,7 +2082,7 @@ static int smb2_create_open_flags(bool file_present, __le32 access, ...@@ -2080,7 +2082,7 @@ static int smb2_create_open_flags(bool file_present, __le32 access,
*may_flags = MAY_OPEN | MAY_READ; *may_flags = MAY_OPEN | MAY_READ;
} }
if (access == FILE_READ_ATTRIBUTES_LE) if (access == FILE_READ_ATTRIBUTES_LE || S_ISBLK(mode) || S_ISCHR(mode))
oflags |= O_PATH; oflags |= O_PATH;
if (file_present) { if (file_present) {
...@@ -3175,8 +3177,8 @@ int smb2_open(struct ksmbd_work *work) ...@@ -3175,8 +3177,8 @@ int smb2_open(struct ksmbd_work *work)
open_flags = smb2_create_open_flags(file_present, daccess, open_flags = smb2_create_open_flags(file_present, daccess,
req->CreateDisposition, req->CreateDisposition,
&may_flags, &may_flags,
req->CreateOptions & FILE_DIRECTORY_FILE_LE || req->CreateOptions,
(file_present && S_ISDIR(d_inode(path.dentry)->i_mode))); file_present ? d_inode(path.dentry)->i_mode : 0);
if (!test_tree_conn_flag(tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) { if (!test_tree_conn_flag(tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) {
if (open_flags & (O_CREAT | O_TRUNC)) { if (open_flags & (O_CREAT | O_TRUNC)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment