Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit df7f9967 authored by Joel Becker's avatar Joel Becker
Browse files

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
Loading
Loading
Loading
Loading
+4 −2
Original line number Original line Diff line number Diff line
@@ -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)
		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);