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>
This commit is contained in:
Tejun Heo 2013-09-18 17:15:38 -04:00 committed by Greg Kroah-Hartman
parent bcdde7e221
commit 250f7c3fee
4 changed files with 29 additions and 28 deletions

View file

@ -545,7 +545,8 @@ int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd,
* LOCKING: * LOCKING:
* Determined by sysfs_addrm_start(). * 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; struct sysfs_inode_attrs *ps_iattr;
@ -775,20 +776,6 @@ const struct inode_operations sysfs_dir_inode_operations = {
.setxattr = sysfs_setxattr, .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) static struct sysfs_dirent *sysfs_leftmost_descendant(struct sysfs_dirent *pos)
{ {
struct sysfs_dirent *last; struct sysfs_dirent *last;
@ -844,25 +831,36 @@ static struct sysfs_dirent *sysfs_next_descendant_post(struct sysfs_dirent *pos,
return pos->s_parent; 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; struct sysfs_dirent *pos, *next;
if (!dir_sd) if (!sd)
return; return;
pr_debug("sysfs %s: removing dir\n", dir_sd->s_name); pr_debug("sysfs %s: removing\n", sd->s_name);
sysfs_addrm_start(&acxt);
next = NULL; next = NULL;
do { do {
pos = next; pos = next;
next = sysfs_next_descendant_post(pos, dir_sd); next = sysfs_next_descendant_post(pos, sd);
if (pos) if (pos)
sysfs_remove_one(&acxt, pos); sysfs_remove_one(acxt, pos);
} while (next); } 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); sysfs_addrm_finish(&acxt);
} }
@ -882,7 +880,10 @@ void sysfs_remove_dir(struct kobject *kobj)
kobj->sd = NULL; kobj->sd = NULL;
spin_unlock(&sysfs_assoc_lock); 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, int sysfs_rename(struct sysfs_dirent *sd, struct sysfs_dirent *new_parent_sd,

View file

@ -111,7 +111,7 @@ static int internal_create_group(struct kobject *kobj, int update,
error = create_files(sd, kobj, grp, update); error = create_files(sd, kobj, grp, update);
if (error) { if (error) {
if (grp->name) if (grp->name)
sysfs_remove_subdir(sd); sysfs_remove(sd);
} }
sysfs_put(sd); sysfs_put(sd);
return error; return error;
@ -219,7 +219,7 @@ void sysfs_remove_group(struct kobject *kobj,
remove_files(sd, kobj, grp); remove_files(sd, kobj, grp);
if (grp->name) if (grp->name)
sysfs_remove_subdir(sd); sysfs_remove(sd);
sysfs_put(sd); sysfs_put(sd);
} }

View file

@ -330,7 +330,7 @@ int sysfs_hash_and_remove(struct sysfs_dirent *dir_sd, const char *name,
sd = sysfs_find_dirent(dir_sd, name, ns); sd = sysfs_find_dirent(dir_sd, name, ns);
if (sd) if (sd)
sysfs_remove_one(&acxt, sd); __sysfs_remove(&acxt, sd);
sysfs_addrm_finish(&acxt); sysfs_addrm_finish(&acxt);

View file

@ -158,7 +158,8 @@ int __sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd,
struct sysfs_dirent *parent_sd); struct sysfs_dirent *parent_sd);
int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd, int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd,
struct sysfs_dirent *parent_sd); struct sysfs_dirent *parent_sd);
void sysfs_remove_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd); void __sysfs_remove(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd);
void sysfs_remove(struct sysfs_dirent *sd);
void sysfs_addrm_finish(struct sysfs_addrm_cxt *acxt); void sysfs_addrm_finish(struct sysfs_addrm_cxt *acxt);
struct sysfs_dirent *sysfs_find_dirent(struct sysfs_dirent *parent_sd, struct sysfs_dirent *sysfs_find_dirent(struct sysfs_dirent *parent_sd,
@ -170,7 +171,6 @@ void release_sysfs_dirent(struct sysfs_dirent *sd);
int sysfs_create_subdir(struct kobject *kobj, const char *name, int sysfs_create_subdir(struct kobject *kobj, const char *name,
struct sysfs_dirent **p_sd); struct sysfs_dirent **p_sd);
void sysfs_remove_subdir(struct sysfs_dirent *sd);
int sysfs_rename(struct sysfs_dirent *sd, struct sysfs_dirent *new_parent_sd, int sysfs_rename(struct sysfs_dirent *sd, struct sysfs_dirent *new_parent_sd,
const char *new_name, const void *new_ns); const char *new_name, const void *new_ns);