diff options
author | Christoph Hellwig <hch@lst.de> | 2016-02-26 05:02:14 -0500 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2016-03-06 10:11:24 -0500 |
commit | 1ae1602de028acaa42a0f6ff18d19756f8e825c6 (patch) | |
tree | 3370e5c29945370f62b9c72adeec587ed102d048 /fs/configfs | |
parent | b1f1a29d8fb5eeaeec2cafe4c62f276d950c015b (diff) |
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>
Diffstat (limited to 'fs/configfs')
-rw-r--r-- | fs/configfs/dir.c | 44 | ||||
-rw-r--r-- | fs/configfs/item.c | 1 |
2 files changed, 21 insertions, 24 deletions
diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c index f419519ec41f..b51ce6778145 100644 --- a/fs/configfs/dir.c +++ b/fs/configfs/dir.c | |||
@@ -701,23 +701,29 @@ static int populate_groups(struct config_group *group) | |||
701 | { | 701 | { |
702 | struct config_group *new_group; | 702 | struct config_group *new_group; |
703 | int ret = 0; | 703 | int ret = 0; |
704 | int i; | ||
705 | |||
706 | if (group->default_groups) { | ||
707 | for (i = 0; group->default_groups[i]; i++) { | ||
708 | new_group = group->default_groups[i]; | ||
709 | 704 | ||
710 | ret = create_default_group(group, new_group); | 705 | list_for_each_entry(new_group, &group->default_groups, group_entry) { |
711 | if (ret) { | 706 | ret = create_default_group(group, new_group); |
712 | detach_groups(group); | 707 | if (ret) { |
713 | break; | 708 | detach_groups(group); |
714 | } | 709 | break; |
715 | } | 710 | } |
716 | } | 711 | } |
717 | 712 | ||
718 | return ret; | 713 | return ret; |
719 | } | 714 | } |
720 | 715 | ||
716 | void configfs_remove_default_groups(struct config_group *group) | ||
717 | { | ||
718 | struct config_group *g, *n; | ||
719 | |||
720 | list_for_each_entry_safe(g, n, &group->default_groups, group_entry) { | ||
721 | list_del(&g->group_entry); | ||
722 | config_item_put(&g->cg_item); | ||
723 | } | ||
724 | } | ||
725 | EXPORT_SYMBOL(configfs_remove_default_groups); | ||
726 | |||
721 | /* | 727 | /* |
722 | * All of link_obj/unlink_obj/link_group/unlink_group require that | 728 | * All of link_obj/unlink_obj/link_group/unlink_group require that |
723 | * subsys->su_mutex is held. | 729 | * subsys->su_mutex is held. |
@@ -766,15 +772,10 @@ static void link_obj(struct config_item *parent_item, struct config_item *item) | |||
766 | 772 | ||
767 | static void unlink_group(struct config_group *group) | 773 | static void unlink_group(struct config_group *group) |
768 | { | 774 | { |
769 | int i; | ||
770 | struct config_group *new_group; | 775 | struct config_group *new_group; |
771 | 776 | ||
772 | if (group->default_groups) { | 777 | list_for_each_entry(new_group, &group->default_groups, group_entry) |
773 | for (i = 0; group->default_groups[i]; i++) { | 778 | unlink_group(new_group); |
774 | new_group = group->default_groups[i]; | ||
775 | unlink_group(new_group); | ||
776 | } | ||
777 | } | ||
778 | 779 | ||
779 | group->cg_subsys = NULL; | 780 | group->cg_subsys = NULL; |
780 | unlink_obj(&group->cg_item); | 781 | unlink_obj(&group->cg_item); |
@@ -782,7 +783,6 @@ static void unlink_group(struct config_group *group) | |||
782 | 783 | ||
783 | static void link_group(struct config_group *parent_group, struct config_group *group) | 784 | static void link_group(struct config_group *parent_group, struct config_group *group) |
784 | { | 785 | { |
785 | int i; | ||
786 | struct config_group *new_group; | 786 | struct config_group *new_group; |
787 | struct configfs_subsystem *subsys = NULL; /* gcc is a turd */ | 787 | struct configfs_subsystem *subsys = NULL; /* gcc is a turd */ |
788 | 788 | ||
@@ -796,12 +796,8 @@ static void link_group(struct config_group *parent_group, struct config_group *g | |||
796 | BUG(); | 796 | BUG(); |
797 | group->cg_subsys = subsys; | 797 | group->cg_subsys = subsys; |
798 | 798 | ||
799 | if (group->default_groups) { | 799 | list_for_each_entry(new_group, &group->default_groups, group_entry) |
800 | for (i = 0; group->default_groups[i]; i++) { | 800 | link_group(group, new_group); |
801 | new_group = group->default_groups[i]; | ||
802 | link_group(group, new_group); | ||
803 | } | ||
804 | } | ||
805 | } | 801 | } |
806 | 802 | ||
807 | /* | 803 | /* |
diff --git a/fs/configfs/item.c b/fs/configfs/item.c index b863a09cd2f1..8b2a994042dd 100644 --- a/fs/configfs/item.c +++ b/fs/configfs/item.c | |||
@@ -182,6 +182,7 @@ void config_group_init(struct config_group *group) | |||
182 | { | 182 | { |
183 | config_item_init(&group->cg_item); | 183 | config_item_init(&group->cg_item); |
184 | INIT_LIST_HEAD(&group->cg_children); | 184 | INIT_LIST_HEAD(&group->cg_children); |
185 | INIT_LIST_HEAD(&group->default_groups); | ||
185 | } | 186 | } |
186 | EXPORT_SYMBOL(config_group_init); | 187 | EXPORT_SYMBOL(config_group_init); |
187 | 188 | ||