|
@@ -1777,6 +1777,16 @@ void configfs_unregister_group(struct config_group *group)
|
|
|
struct dentry *dentry = group->cg_item.ci_dentry;
|
|
|
struct dentry *parent = group->cg_item.ci_parent->ci_dentry;
|
|
|
|
|
|
+ mutex_lock(&subsys->su_mutex);
|
|
|
+ if (!group->cg_item.ci_parent->ci_group) {
|
|
|
+ /*
|
|
|
+ * The parent has already been unlinked and detached
|
|
|
+ * due to a rmdir.
|
|
|
+ */
|
|
|
+ goto unlink_group;
|
|
|
+ }
|
|
|
+ mutex_unlock(&subsys->su_mutex);
|
|
|
+
|
|
|
inode_lock_nested(d_inode(parent), I_MUTEX_PARENT);
|
|
|
spin_lock(&configfs_dirent_lock);
|
|
|
configfs_detach_prep(dentry, NULL);
|
|
@@ -1791,6 +1801,7 @@ void configfs_unregister_group(struct config_group *group)
|
|
|
dput(dentry);
|
|
|
|
|
|
mutex_lock(&subsys->su_mutex);
|
|
|
+unlink_group:
|
|
|
unlink_group(group);
|
|
|
mutex_unlock(&subsys->su_mutex);
|
|
|
}
|