configfs: Don't try to d_delete() negative dentries.
authorJoel Becker <jlbec@evilplan.org>
Tue, 22 Feb 2011 09:09:49 +0000 (01:09 -0800)
committerJoel Becker <jlbec@evilplan.org>
Wed, 18 May 2011 10:30:58 +0000 (03:30 -0700)
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>
fs/configfs/dir.c

index 3313dd19f543841d7e4689cfd18da028e4522892..b11d7342eef2de4847847bef531a87e7bc6816be 100644 (file)
@@ -689,7 +689,8 @@ static int create_default_group(struct config_group *parent_group,
                        sd = child->d_fsdata;
                        sd->s_type |= CONFIGFS_USET_DEFAULT;
                } else {
-                       d_delete(child);
+                       BUG_ON(child->d_inode);
+                       d_drop(child);
                        dput(child);
                }
        }
@@ -1683,7 +1684,8 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys)
                err = configfs_attach_group(sd->s_element, &group->cg_item,
                                            dentry);
                if (err) {
-                       d_delete(dentry);
+                       BUG_ON(dentry->d_inode);
+                       d_drop(dentry);
                        dput(dentry);
                } else {
                        spin_lock(&configfs_dirent_lock);