Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933566AbbHJWag (ORCPT ); Mon, 10 Aug 2015 18:30:36 -0400 Received: from mail-wi0-f182.google.com ([209.85.212.182]:38731 "EHLO mail-wi0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933498AbbHJWad (ORCPT ); Mon, 10 Aug 2015 18:30:33 -0400 From: Daniel Baluta To: jic23@kernel.org, jlbec@evilplan.org, linux-iio@vger.kernel.org, linux-fsdevel@vger.kernel.org Cc: lars@metafoo.de, knaack.h@gmx.de, linux-kernel@vger.kernel.org, octavian.purdila@intel.com, pebolle@tiscali.nl, patrick.porlan@intel.com, adriana.reus@intel.com, constantin.musca@intel.com, marten@intuitiveaerial.com, daniel.baluta@intel.com, cristina.opriceana@gmail.com, pmeerw@pmeerw.net, hch@lst.de, viro@zeniv.linux.org.uk, akpm@linux-foundation.org Subject: [PATCH v7 1/5] configfs: Allow dynamic group (un)registration Date: Tue, 11 Aug 2015 01:42:38 +0300 Message-Id: <1439246562-17515-2-git-send-email-daniel.baluta@intel.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1439246562-17515-1-git-send-email-daniel.baluta@intel.com> References: <1439246562-17515-1-git-send-email-daniel.baluta@intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3553 Lines: 108 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 --- 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-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/