Commit df7f9967 authored by Joel Becker's avatar Joel Becker

configfs: Don't try to d_delete() negative dentries.

When configfs is faking mkdir() on its subsystem or default group
objects, it starts by adding a negative dentry.  It then tries to
instantiate the group.  If that should fail, it must clean up after
itself.

I was using d_delete() here, but configfs_attach_group() promises to
return an empty dentry on error.  d_delete() explodes with the entry
dentry.  Let's try d_drop() instead.  The unhashing is what we want for
our dentry.
Signed-off-by: default avatarJoel Becker <jlbec@evilplan.org>
parent df016c66
...@@ -689,7 +689,8 @@ static int create_default_group(struct config_group *parent_group, ...@@ -689,7 +689,8 @@ static int create_default_group(struct config_group *parent_group,
sd = child->d_fsdata; sd = child->d_fsdata;
sd->s_type |= CONFIGFS_USET_DEFAULT; sd->s_type |= CONFIGFS_USET_DEFAULT;
} else { } else {
d_delete(child); BUG_ON(child->d_inode);
d_drop(child);
dput(child); dput(child);
} }
} }
...@@ -1683,7 +1684,8 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys) ...@@ -1683,7 +1684,8 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys)
err = configfs_attach_group(sd->s_element, &group->cg_item, err = configfs_attach_group(sd->s_element, &group->cg_item,
dentry); dentry);
if (err) { if (err) {
d_delete(dentry); BUG_ON(dentry->d_inode);
d_drop(dentry);
dput(dentry); dput(dentry);
} else { } else {
spin_lock(&configfs_dirent_lock); spin_lock(&configfs_dirent_lock);
......
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