diff options
author | Tejun Heo <tj@kernel.org> | 2013-09-18 17:15:38 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-10-03 16:38:52 -0700 |
commit | 250f7c3fee52b71457b4aa2cafadbd9f8b320b31 (patch) | |
tree | 7240e1eddbcbddf59eb22d0d9ed14f18644ae738 /fs/sysfs/dir.c | |
parent | bcdde7e221a8750f9b62b6d0bd31b72ea4ad9309 (diff) | |
download | lwn-250f7c3fee52b71457b4aa2cafadbd9f8b320b31.tar.gz lwn-250f7c3fee52b71457b4aa2cafadbd9f8b320b31.zip |
sysfs: introduce [__]sysfs_remove()
Given a sysfs_dirent, there is no reason to have multiple versions of
removal functions. A function which removes the specified
sysfs_dirent and its descendants is enough.
This patch intorduces [__}sysfs_remove() which replaces all internal
variations of removal functions. This will be the only removal
function in the planned new sysfs_dirent based interface.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'fs/sysfs/dir.c')
-rw-r--r-- | fs/sysfs/dir.c | 47 |
1 files changed, 24 insertions, 23 deletions
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index 0cdfd8128d3e..b518afd0d11e 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c @@ -545,7 +545,8 @@ int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd, * LOCKING: * Determined by sysfs_addrm_start(). */ -void sysfs_remove_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd) +static void sysfs_remove_one(struct sysfs_addrm_cxt *acxt, + struct sysfs_dirent *sd) { struct sysfs_inode_attrs *ps_iattr; @@ -775,20 +776,6 @@ const struct inode_operations sysfs_dir_inode_operations = { .setxattr = sysfs_setxattr, }; -static void remove_dir(struct sysfs_dirent *sd) -{ - struct sysfs_addrm_cxt acxt; - - sysfs_addrm_start(&acxt); - sysfs_remove_one(&acxt, sd); - sysfs_addrm_finish(&acxt); -} - -void sysfs_remove_subdir(struct sysfs_dirent *sd) -{ - remove_dir(sd); -} - static struct sysfs_dirent *sysfs_leftmost_descendant(struct sysfs_dirent *pos) { struct sysfs_dirent *last; @@ -844,25 +831,36 @@ static struct sysfs_dirent *sysfs_next_descendant_post(struct sysfs_dirent *pos, return pos->s_parent; } -static void __sysfs_remove_dir(struct sysfs_dirent *dir_sd) +void __sysfs_remove(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd) { - struct sysfs_addrm_cxt acxt; struct sysfs_dirent *pos, *next; - if (!dir_sd) + if (!sd) return; - pr_debug("sysfs %s: removing dir\n", dir_sd->s_name); - sysfs_addrm_start(&acxt); + pr_debug("sysfs %s: removing\n", sd->s_name); next = NULL; do { pos = next; - next = sysfs_next_descendant_post(pos, dir_sd); + next = sysfs_next_descendant_post(pos, sd); if (pos) - sysfs_remove_one(&acxt, pos); + sysfs_remove_one(acxt, pos); } while (next); +} +/** + * sysfs_remove - remove a sysfs_dirent recursively + * @sd: the sysfs_dirent to remove + * + * Remove @sd along with all its subdirectories and files. + */ +void sysfs_remove(struct sysfs_dirent *sd) +{ + struct sysfs_addrm_cxt acxt; + + sysfs_addrm_start(&acxt); + __sysfs_remove(&acxt, sd); sysfs_addrm_finish(&acxt); } @@ -882,7 +880,10 @@ void sysfs_remove_dir(struct kobject *kobj) kobj->sd = NULL; spin_unlock(&sysfs_assoc_lock); - __sysfs_remove_dir(sd); + if (sd) { + WARN_ON_ONCE(sysfs_type(sd) != SYSFS_DIR); + sysfs_remove(sd); + } } int sysfs_rename(struct sysfs_dirent *sd, struct sysfs_dirent *new_parent_sd, |