mode |= S_IFDIR;
err = vfs_mkdir(&init_user_ns, d_inode(path.dentry), dentry, mode);
- if (!err) {
+ if (err)
+ goto out;
+ else if (d_unhashed(dentry)) {
+ struct dentry *d;
+
+ d = lookup_one_len(dentry->d_name.name,
+ dentry->d_parent,
+ dentry->d_name.len);
+ if (IS_ERR(d)) {
+ err = PTR_ERR(d);
+ goto out;
+ }
+ if (unlikely(d_is_negative(d))) {
+ dput(d);
+ err = -ENOENT;
+ goto out;
+ }
+
ksmbd_vfs_inherit_owner(work, d_inode(path.dentry),
- d_inode(dentry));
- } else {
- ksmbd_err("mkdir(%s): creation failed (err:%d)\n", name, err);
+ d_inode(d));
+ dput(d);
}
-
+out:
done_path_create(&path, dentry);
+ if (err)
+ ksmbd_err("mkdir(%s): creation failed (err:%d)\n", name, err);
return err;
}