Commit 16d13b59 authored by Al Viro's avatar Al Viro

configfs: sanitize configfs_create()

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent b7c177fc
...@@ -187,36 +187,35 @@ static void configfs_set_inode_lock_class(struct configfs_dirent *sd, ...@@ -187,36 +187,35 @@ static void configfs_set_inode_lock_class(struct configfs_dirent *sd,
int configfs_create(struct dentry * dentry, umode_t mode, int (*init)(struct inode *)) int configfs_create(struct dentry * dentry, umode_t mode, int (*init)(struct inode *))
{ {
int error = 0; int error = 0;
struct inode * inode = NULL; struct inode *inode = NULL;
if (dentry) { struct configfs_dirent *sd;
if (!dentry->d_inode) { struct inode *p_inode;
struct configfs_dirent *sd = dentry->d_fsdata;
if ((inode = configfs_new_inode(mode, sd, dentry->d_sb))) { if (!dentry)
if (dentry->d_parent && dentry->d_parent->d_inode) { return -ENOENT;
struct inode *p_inode = dentry->d_parent->d_inode;
p_inode->i_mtime = p_inode->i_ctime = CURRENT_TIME; if (dentry->d_inode)
} return -EEXIST;
configfs_set_inode_lock_class(sd, inode);
goto Proceed;
}
else
error = -ENOMEM;
} else
error = -EEXIST;
} else
error = -ENOENT;
goto Done;
Proceed: sd = dentry->d_fsdata;
if (init) inode = configfs_new_inode(mode, sd, dentry->d_sb);
if (!inode)
return -ENOMEM;
p_inode = dentry->d_parent->d_inode;
p_inode->i_mtime = p_inode->i_ctime = CURRENT_TIME;
configfs_set_inode_lock_class(sd, inode);
if (init) {
error = init(inode); error = init(inode);
if (!error) { if (error) {
d_instantiate(dentry, inode); iput(inode);
if (S_ISDIR(mode) || S_ISLNK(mode)) return error;
dget(dentry); /* pin link and directory dentries in core */ }
} else }
iput(inode); d_instantiate(dentry, inode);
Done: if (S_ISDIR(mode) || S_ISLNK(mode))
dget(dentry); /* pin link and directory dentries in core */
return error; return error;
} }
......
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