mirror of
https://github.com/torvalds/linux.git
synced 2024-11-14 16:12:02 +00:00
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: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
parent
d782d6e1d9
commit
8e2f6a0e2d
@ -2052,18 +2052,20 @@ out_err1:
|
||||
* @access: file access flags
|
||||
* @disposition: file disposition 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
|
||||
*/
|
||||
static int smb2_create_open_flags(bool file_present, __le32 access,
|
||||
__le32 disposition,
|
||||
int *may_flags,
|
||||
bool is_dir)
|
||||
__le32 coptions,
|
||||
umode_t mode)
|
||||
{
|
||||
int oflags = O_NONBLOCK | O_LARGEFILE;
|
||||
|
||||
if (is_dir) {
|
||||
if (coptions & FILE_DIRECTORY_FILE_LE || S_ISDIR(mode)) {
|
||||
access &= ~FILE_WRITE_DESIRE_ACCESS_LE;
|
||||
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,
|
||||
*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;
|
||||
|
||||
if (file_present) {
|
||||
@ -3175,8 +3177,8 @@ int smb2_open(struct ksmbd_work *work)
|
||||
open_flags = smb2_create_open_flags(file_present, daccess,
|
||||
req->CreateDisposition,
|
||||
&may_flags,
|
||||
req->CreateOptions & FILE_DIRECTORY_FILE_LE ||
|
||||
(file_present && S_ISDIR(d_inode(path.dentry)->i_mode)));
|
||||
req->CreateOptions,
|
||||
file_present ? d_inode(path.dentry)->i_mode : 0);
|
||||
|
||||
if (!test_tree_conn_flag(tcon, KSMBD_TREE_CONN_FLAG_WRITABLE)) {
|
||||
if (open_flags & (O_CREAT | O_TRUNC)) {
|
||||
|
Loading…
Reference in New Issue
Block a user