From: NeilBrown If atomic_open is given __O_REGULAR, we now would prefer -EISDIR if a directory was found. So move the S_ISDIR() tests earlier. Also don't return -EFTYPE for S_ISLNK() - that should get -ELOOP and only if O_NOFOLLOW. Signed-off-by: NeilBrown --- fs/smb/client/dir.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/fs/smb/client/dir.c b/fs/smb/client/dir.c index 6fa6d48fdfd3..08425c9eea42 100644 --- a/fs/smb/client/dir.c +++ b/fs/smb/client/dir.c @@ -237,16 +237,18 @@ static int __cifs_do_create(struct inode *dir, struct dentry *direntry, goto cifs_create_get_file_info; } - if ((oflags & __O_REGULAR) && !S_ISREG(newinode->i_mode)) { + if (S_ISDIR(newinode->i_mode)) { CIFSSMBClose(xid, tcon, fid->netfid); iput(newinode); - return -EFTYPE; + return -EISDIR; } - if (S_ISDIR(newinode->i_mode)) { + if ((oflags & __O_REGULAR) && + !S_ISREG(newinode->i_mode) && + !S_ISLNK(newinode->i_mode)) { CIFSSMBClose(xid, tcon, fid->netfid); iput(newinode); - return -EISDIR; + return -EFTYPE; } if (!S_ISREG(newinode->i_mode)) { @@ -461,14 +463,16 @@ cifs_create_set_dentry: } if (newinode) { - if ((oflags & __O_REGULAR) && !S_ISREG(newinode->i_mode)) { - rc = -EFTYPE; - goto out_err; - } if (S_ISDIR(newinode->i_mode)) { rc = -EISDIR; goto out_err; } + if ((oflags & __O_REGULAR) && + !S_ISREG(newinode->i_mode) && + !S_ISLNK(newinode->i_mode)) { + rc = -EFTYPE; + goto out_err; + } } *inode = newinode; -- 2.50.0.107.gf914562f5916.dirty