struct dentry *simple_mkdir(struct dentry *dir, char *name, int mode)
{
struct dentry *dchild;
- int err;
+ int err = 0;
ENTRY;
ASSERT_KERNEL_CTXT("kernel doing mkdir outside kernel context\n");
CDEBUG(D_INODE, "creating directory %*s\n", strlen(name), name);
+ down(&dir->i_sem);
dchild = lookup_one_len(name, dir, strlen(name));
if (IS_ERR(dchild))
- RETURN(dchild);
+ GOTO(out, PTR_ERR(dchild));
if (dchild->d_inode) {
if (!S_ISDIR(dchild->d_inode->i_mode))
GOTO(out, err = -ENOTDIR);
- RETURN(dchild);
+ GOTO(out, dchild);
}
err = vfs_mkdir(dir->d_inode, dchild, mode);
EXIT;
out:
+ up(&dir->i_sem);
if (err) {
dput(dchild);
RETURN(ERR_PTR(err));