We don't want to hardcode default groups at subsystem creation time. Thus, we export: * configfs_register_group * configfs_unregister_group that allows drivers to programatically create/destroy groups. Signed-off-by: Daniel Baluta <daniel.baluta@xxxxxxxxx> --- I am not sure about the locking scheme here, Joel can you help? :) fs/configfs/dir.c | 39 +++++++++++++++++++++++++++++++++++++-- include/linux/configfs.h | 4 ++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c index c81ce7f..dde3251 100644 --- a/fs/configfs/dir.c +++ b/fs/configfs/dir.c @@ -651,7 +651,8 @@ static void detach_groups(struct config_group *group) * try using vfs_mkdir. Just a thought. */ static int create_default_group(struct config_group *parent_group, - struct config_group *group) + struct config_group *group, + struct dentry **dentry) { int ret; struct configfs_dirent *sd; @@ -671,6 +672,8 @@ static int create_default_group(struct config_group *parent_group, if (!ret) { sd = child->d_fsdata; sd->s_type |= CONFIGFS_USET_DEFAULT; + if (dentry) + *dentry = child; } else { BUG_ON(d_inode(child)); d_drop(child); @@ -691,7 +694,7 @@ static int populate_groups(struct config_group *group) for (i = 0; group->default_groups[i]; i++) { new_group = group->default_groups[i]; - ret = create_default_group(group, new_group); + ret = create_default_group(group, new_group, NULL); if (ret) { detach_groups(group); break; @@ -1636,6 +1639,38 @@ const struct file_operations configfs_dir_operations = { .iterate = configfs_readdir, }; +int configfs_register_group(struct config_group *parent_group, + struct config_group *group) +{ + struct dentry *dentry; + int ret; + + link_group(parent_group, group); + + ret = create_default_group(parent_group, group, &dentry); + if (ret == 0) + configfs_dir_set_ready(dentry->d_fsdata); + + return ret; +} +EXPORT_SYMBOL(configfs_register_group); + +void configfs_unregister_group(struct config_group *group) +{ + struct dentry *dentry = group->cg_item.ci_dentry; + + mutex_lock(&d_inode(dentry)->i_mutex); + configfs_detach_group(&group->cg_item); + d_inode(dentry)->i_flags |= S_DEAD; + dont_mount(dentry); + mutex_unlock(&d_inode(dentry)->i_mutex); + + d_delete(dentry); + dput(dentry); + unlink_group(group); +} +EXPORT_SYMBOL(configfs_unregister_group); + int configfs_register_subsystem(struct configfs_subsystem *subsys) { int err; diff --git a/include/linux/configfs.h b/include/linux/configfs.h index c9e5c57..726980e 100644 --- a/include/linux/configfs.h +++ b/include/linux/configfs.h @@ -251,6 +251,10 @@ static inline struct configfs_subsystem *to_configfs_subsystem(struct config_gro int configfs_register_subsystem(struct configfs_subsystem *subsys); void configfs_unregister_subsystem(struct configfs_subsystem *subsys); +int configfs_register_group(struct config_group *parent_group, + struct config_group *group); +void configfs_unregister_group(struct config_group *group); + /* These functions can sleep and can alloc with GFP_KERNEL */ /* WARNING: These cannot be called underneath configfs callbacks!! */ int configfs_depend_item(struct configfs_subsystem *subsys, struct config_item *target); -- 2.1.4 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html