diff options
author | Joel Becker <jlbec@evilplan.org> | 2011-02-22 04:09:49 -0500 |
---|---|---|
committer | Joel Becker <jlbec@evilplan.org> | 2011-05-18 06:30:58 -0400 |
commit | df7f99670a4c76f269ae57ce91876b309417a316 (patch) | |
tree | 5af5b63ab22089f32f1f464035df061bc2955e8e | |
parent | df016c665b10ae80d8db67ec8103b50c5c234e5c (diff) |
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: Joel Becker <jlbec@evilplan.org>
-rw-r--r-- | fs/configfs/dir.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c index 3313dd19f543..b11d7342eef2 100644 --- a/fs/configfs/dir.c +++ b/fs/configfs/dir.c | |||
@@ -689,7 +689,8 @@ static int create_default_group(struct config_group *parent_group, | |||
689 | sd = child->d_fsdata; | 689 | sd = child->d_fsdata; |
690 | sd->s_type |= CONFIGFS_USET_DEFAULT; | 690 | sd->s_type |= CONFIGFS_USET_DEFAULT; |
691 | } else { | 691 | } else { |
692 | d_delete(child); | 692 | BUG_ON(child->d_inode); |
693 | d_drop(child); | ||
693 | dput(child); | 694 | dput(child); |
694 | } | 695 | } |
695 | } | 696 | } |
@@ -1683,7 +1684,8 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys) | |||
1683 | err = configfs_attach_group(sd->s_element, &group->cg_item, | 1684 | err = configfs_attach_group(sd->s_element, &group->cg_item, |
1684 | dentry); | 1685 | dentry); |
1685 | if (err) { | 1686 | if (err) { |
1686 | d_delete(dentry); | 1687 | BUG_ON(dentry->d_inode); |
1688 | d_drop(dentry); | ||
1687 | dput(dentry); | 1689 | dput(dentry); |
1688 | } else { | 1690 | } else { |
1689 | spin_lock(&configfs_dirent_lock); | 1691 | spin_lock(&configfs_dirent_lock); |