aboutsummaryrefslogtreecommitdiffstats
path: root/fs/configfs/dir.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/configfs/dir.c')
-rw-r--r--fs/configfs/dir.c53
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
445static struct dentry * configfs_lookup(struct inode *dir, 440static 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
711void 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}
720EXPORT_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
767static void unlink_group(struct config_group *group) 768static 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
783static void link_group(struct config_group *parent_group, struct config_group *group) 779static 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/*