configfs: switch ->default groups to a linked list
Replace the current NULL-terminated array of default groups with a linked list. This gets rid of lots of nasty code to size and/or dynamically allocate the array. While we're at it also provide a conveniant helper to remove the default groups. Signed-off-by: Christoph Hellwig <hch@lst.de> Acked-by: Felipe Balbi <balbi@kernel.org> [drivers/usb/gadget] Acked-by: Joel Becker <jlbec@evilplan.org> Acked-by: Nicholas Bellinger <nab@linux-iscsi.org> Reviewed-by: Sagi Grimberg <sagig@mellanox.com>
This commit is contained in:
@@ -701,23 +701,29 @@ static int populate_groups(struct config_group *group)
|
||||
{
|
||||
struct config_group *new_group;
|
||||
int ret = 0;
|
||||
int i;
|
||||
|
||||
if (group->default_groups) {
|
||||
for (i = 0; group->default_groups[i]; i++) {
|
||||
new_group = group->default_groups[i];
|
||||
|
||||
ret = create_default_group(group, new_group);
|
||||
if (ret) {
|
||||
detach_groups(group);
|
||||
break;
|
||||
}
|
||||
list_for_each_entry(new_group, &group->default_groups, group_entry) {
|
||||
ret = create_default_group(group, new_group);
|
||||
if (ret) {
|
||||
detach_groups(group);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void configfs_remove_default_groups(struct config_group *group)
|
||||
{
|
||||
struct config_group *g, *n;
|
||||
|
||||
list_for_each_entry_safe(g, n, &group->default_groups, group_entry) {
|
||||
list_del(&g->group_entry);
|
||||
config_item_put(&g->cg_item);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(configfs_remove_default_groups);
|
||||
|
||||
/*
|
||||
* All of link_obj/unlink_obj/link_group/unlink_group require that
|
||||
* subsys->su_mutex is held.
|
||||
@@ -766,15 +772,10 @@ static void link_obj(struct config_item *parent_item, struct config_item *item)
|
||||
|
||||
static void unlink_group(struct config_group *group)
|
||||
{
|
||||
int i;
|
||||
struct config_group *new_group;
|
||||
|
||||
if (group->default_groups) {
|
||||
for (i = 0; group->default_groups[i]; i++) {
|
||||
new_group = group->default_groups[i];
|
||||
unlink_group(new_group);
|
||||
}
|
||||
}
|
||||
list_for_each_entry(new_group, &group->default_groups, group_entry)
|
||||
unlink_group(new_group);
|
||||
|
||||
group->cg_subsys = NULL;
|
||||
unlink_obj(&group->cg_item);
|
||||
@@ -782,7 +783,6 @@ static void unlink_group(struct config_group *group)
|
||||
|
||||
static void link_group(struct config_group *parent_group, struct config_group *group)
|
||||
{
|
||||
int i;
|
||||
struct config_group *new_group;
|
||||
struct configfs_subsystem *subsys = NULL; /* gcc is a turd */
|
||||
|
||||
@@ -796,12 +796,8 @@ static void link_group(struct config_group *parent_group, struct config_group *g
|
||||
BUG();
|
||||
group->cg_subsys = subsys;
|
||||
|
||||
if (group->default_groups) {
|
||||
for (i = 0; group->default_groups[i]; i++) {
|
||||
new_group = group->default_groups[i];
|
||||
link_group(group, new_group);
|
||||
}
|
||||
}
|
||||
list_for_each_entry(new_group, &group->default_groups, group_entry)
|
||||
link_group(group, new_group);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -182,6 +182,7 @@ void config_group_init(struct config_group *group)
|
||||
{
|
||||
config_item_init(&group->cg_item);
|
||||
INIT_LIST_HEAD(&group->cg_children);
|
||||
INIT_LIST_HEAD(&group->default_groups);
|
||||
}
|
||||
EXPORT_SYMBOL(config_group_init);
|
||||
|
||||
|
Reference in New Issue
Block a user