Commit ce8644fc authored by Al Viro's avatar Al Viro

lookup_open(): expand the call of vfs_create()

Lift IS_DEADDIR handling up into the part common with atomic_open(),
remove it from the latter.  Collapse permission checks into the
call of may_o_create(), getting it closer to atomic_open() case.
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 6ac08709
...@@ -2838,12 +2838,6 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry, ...@@ -2838,12 +2838,6 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry,
BUG_ON(dentry->d_inode); BUG_ON(dentry->d_inode);
/* Don't create child dentry for a dead directory. */
if (unlikely(IS_DEADDIR(dir))) {
error = -ENOENT;
goto out;
}
mode = op->mode; mode = op->mode;
if ((open_flag & O_CREAT) && !IS_POSIXACL(dir)) if ((open_flag & O_CREAT) && !IS_POSIXACL(dir))
mode &= ~current_umask(); mode &= ~current_umask();
...@@ -3004,6 +2998,9 @@ static int lookup_open(struct nameidata *nd, struct path *path, ...@@ -3004,6 +2998,9 @@ static int lookup_open(struct nameidata *nd, struct path *path,
int error; int error;
bool need_lookup = false; bool need_lookup = false;
if (unlikely(IS_DEADDIR(dir_inode)))
return -ENOENT;
*opened &= ~FILE_CREATED; *opened &= ~FILE_CREATED;
dentry = lookup_dcache(&nd->last, dir, nd->flags); dentry = lookup_dcache(&nd->last, dir, nd->flags);
if (IS_ERR(dentry)) if (IS_ERR(dentry))
...@@ -3049,13 +3046,19 @@ static int lookup_open(struct nameidata *nd, struct path *path, ...@@ -3049,13 +3046,19 @@ static int lookup_open(struct nameidata *nd, struct path *path,
goto out_dput; goto out_dput;
} }
*opened |= FILE_CREATED; *opened |= FILE_CREATED;
error = security_path_mknod(&nd->path, dentry, mode, 0); audit_inode_child(dir_inode, dentry, AUDIT_TYPE_CHILD_CREATE);
error = may_o_create(&nd->path, dentry, mode);
if (error) if (error)
goto out_dput; goto out_dput;
error = vfs_create(dir->d_inode, dentry, mode, if (!dir_inode->i_op->create) {
nd->flags & LOOKUP_EXCL); error = -EACCES;
goto out_dput;
}
error = dir_inode->i_op->create(dir_inode, dentry, mode,
op->open_flag & O_EXCL);
if (error) if (error)
goto out_dput; goto out_dput;
fsnotify_create(dir_inode, dentry);
} }
out_no_open: out_no_open:
path->dentry = dentry; path->dentry = dentry;
......
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