diff options
Diffstat (limited to 'fs/configfs/dir.c')
-rw-r--r-- | fs/configfs/dir.c | 53 |
1 files changed, 22 insertions, 31 deletions
diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c index f419519ec41f..ea59c891fc53 100644 --- a/fs/configfs/dir.c +++ b/fs/configfs/dir.c | |||
@@ -432,14 +432,9 @@ static int configfs_attach_attr(struct configfs_dirent * sd, struct dentry * den | |||
432 | (sd->s_type & CONFIGFS_ITEM_BIN_ATTR) ? | 432 | (sd->s_type & CONFIGFS_ITEM_BIN_ATTR) ? |
433 | configfs_init_bin_file : | 433 | configfs_init_bin_file : |
434 | configfs_init_file); | 434 | configfs_init_file); |
435 | if (error) { | 435 | if (error) |
436 | configfs_put(sd); | 436 | configfs_put(sd); |
437 | return error; | 437 | return error; |
438 | } | ||
439 | |||
440 | d_rehash(dentry); | ||
441 | |||
442 | return 0; | ||
443 | } | 438 | } |
444 | 439 | ||
445 | static struct dentry * configfs_lookup(struct inode *dir, | 440 | static struct dentry * configfs_lookup(struct inode *dir, |
@@ -701,23 +696,29 @@ static int populate_groups(struct config_group *group) | |||
701 | { | 696 | { |
702 | struct config_group *new_group; | 697 | struct config_group *new_group; |
703 | int ret = 0; | 698 | 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 | 699 | ||
710 | ret = create_default_group(group, new_group); | 700 | list_for_each_entry(new_group, &group->default_groups, group_entry) { |
711 | if (ret) { | 701 | ret = create_default_group(group, new_group); |
712 | detach_groups(group); | 702 | if (ret) { |
713 | break; | 703 | detach_groups(group); |
714 | } | 704 | break; |
715 | } | 705 | } |
716 | } | 706 | } |
717 | 707 | ||
718 | return ret; | 708 | return ret; |
719 | } | 709 | } |
720 | 710 | ||
711 | void configfs_remove_default_groups(struct config_group *group) | ||
712 | { | ||
713 | struct config_group *g, *n; | ||
714 | |||
715 | list_for_each_entry_safe(g, n, &group->default_groups, group_entry) { | ||
716 | list_del(&g->group_entry); | ||
717 | config_item_put(&g->cg_item); | ||
718 | } | ||
719 | } | ||
720 | EXPORT_SYMBOL(configfs_remove_default_groups); | ||
721 | |||
721 | /* | 722 | /* |
722 | * All of link_obj/unlink_obj/link_group/unlink_group require that | 723 | * All of link_obj/unlink_obj/link_group/unlink_group require that |
723 | * subsys->su_mutex is held. | 724 | * subsys->su_mutex is held. |
@@ -766,15 +767,10 @@ static void link_obj(struct config_item *parent_item, struct config_item *item) | |||
766 | 767 | ||
767 | static void unlink_group(struct config_group *group) | 768 | static void unlink_group(struct config_group *group) |
768 | { | 769 | { |
769 | int i; | ||
770 | struct config_group *new_group; | 770 | struct config_group *new_group; |
771 | 771 | ||
772 | if (group->default_groups) { | 772 | list_for_each_entry(new_group, &group->default_groups, group_entry) |
773 | for (i = 0; group->default_groups[i]; i++) { | 773 | unlink_group(new_group); |
774 | new_group = group->default_groups[i]; | ||
775 | unlink_group(new_group); | ||
776 | } | ||
777 | } | ||
778 | 774 | ||
779 | group->cg_subsys = NULL; | 775 | group->cg_subsys = NULL; |
780 | unlink_obj(&group->cg_item); | 776 | unlink_obj(&group->cg_item); |
@@ -782,7 +778,6 @@ static void unlink_group(struct config_group *group) | |||
782 | 778 | ||
783 | static void link_group(struct config_group *parent_group, struct config_group *group) | 779 | static void link_group(struct config_group *parent_group, struct config_group *group) |
784 | { | 780 | { |
785 | int i; | ||
786 | struct config_group *new_group; | 781 | struct config_group *new_group; |
787 | struct configfs_subsystem *subsys = NULL; /* gcc is a turd */ | 782 | struct configfs_subsystem *subsys = NULL; /* gcc is a turd */ |
788 | 783 | ||
@@ -796,12 +791,8 @@ static void link_group(struct config_group *parent_group, struct config_group *g | |||
796 | BUG(); | 791 | BUG(); |
797 | group->cg_subsys = subsys; | 792 | group->cg_subsys = subsys; |
798 | 793 | ||
799 | if (group->default_groups) { | 794 | list_for_each_entry(new_group, &group->default_groups, group_entry) |
800 | for (i = 0; group->default_groups[i]; i++) { | 795 | link_group(group, new_group); |
801 | new_group = group->default_groups[i]; | ||
802 | link_group(group, new_group); | ||
803 | } | ||
804 | } | ||
805 | } | 796 | } |
806 | 797 | ||
807 | /* | 798 | /* |