sysfs, kernfs: introduce kernfs[_find_and]_get() and kernfs_put()
Introduce kernfs interface for finding, getting and putting sysfs_dirents. * sysfs_find_dirent() is renamed to kernfs_find_ns() and lockdep assertion for sysfs_mutex is added. * sysfs_get_dirent_ns() is renamed to kernfs_find_and_get(). * Macro inline dancing around __sysfs_get/put() are removed and kernfs_get/put() are made proper functions implemented in fs/sysfs/dir.c. While the conversions are mostly equivalent, there's one difference - kernfs_get() doesn't return the input param as its return value. This change is intentional. While passing through the input increases writability in some areas, it is unnecessary and has been shown to cause confusion regarding how the last ref is handled. Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
517e64f578
commit
ccf73cf336
@@ -108,13 +108,13 @@ static int internal_create_group(struct kobject *kobj, int update,
|
||||
}
|
||||
} else
|
||||
sd = kobj->sd;
|
||||
sysfs_get(sd);
|
||||
kernfs_get(sd);
|
||||
error = create_files(sd, kobj, grp, update);
|
||||
if (error) {
|
||||
if (grp->name)
|
||||
kernfs_remove(sd);
|
||||
}
|
||||
sysfs_put(sd);
|
||||
kernfs_put(sd);
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -208,21 +208,23 @@ void sysfs_remove_group(struct kobject *kobj,
|
||||
struct sysfs_dirent *sd;
|
||||
|
||||
if (grp->name) {
|
||||
sd = sysfs_get_dirent(dir_sd, grp->name);
|
||||
sd = kernfs_find_and_get(dir_sd, grp->name);
|
||||
if (!sd) {
|
||||
WARN(!sd, KERN_WARNING
|
||||
"sysfs group %p not found for kobject '%s'\n",
|
||||
grp, kobject_name(kobj));
|
||||
return;
|
||||
}
|
||||
} else
|
||||
sd = sysfs_get(dir_sd);
|
||||
} else {
|
||||
sd = dir_sd;
|
||||
kernfs_get(sd);
|
||||
}
|
||||
|
||||
remove_files(sd, kobj, grp);
|
||||
if (grp->name)
|
||||
kernfs_remove(sd);
|
||||
|
||||
sysfs_put(sd);
|
||||
kernfs_put(sd);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sysfs_remove_group);
|
||||
|
||||
@@ -263,7 +265,7 @@ int sysfs_merge_group(struct kobject *kobj,
|
||||
struct attribute *const *attr;
|
||||
int i;
|
||||
|
||||
dir_sd = sysfs_get_dirent(kobj->sd, grp->name);
|
||||
dir_sd = kernfs_find_and_get(kobj->sd, grp->name);
|
||||
if (!dir_sd)
|
||||
return -ENOENT;
|
||||
|
||||
@@ -273,7 +275,7 @@ int sysfs_merge_group(struct kobject *kobj,
|
||||
while (--i >= 0)
|
||||
kernfs_remove_by_name(dir_sd, (*--attr)->name);
|
||||
}
|
||||
sysfs_put(dir_sd);
|
||||
kernfs_put(dir_sd);
|
||||
|
||||
return error;
|
||||
}
|
||||
@@ -290,11 +292,11 @@ void sysfs_unmerge_group(struct kobject *kobj,
|
||||
struct sysfs_dirent *dir_sd;
|
||||
struct attribute *const *attr;
|
||||
|
||||
dir_sd = sysfs_get_dirent(kobj->sd, grp->name);
|
||||
dir_sd = kernfs_find_and_get(kobj->sd, grp->name);
|
||||
if (dir_sd) {
|
||||
for (attr = grp->attrs; *attr; ++attr)
|
||||
kernfs_remove_by_name(dir_sd, (*attr)->name);
|
||||
sysfs_put(dir_sd);
|
||||
kernfs_put(dir_sd);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sysfs_unmerge_group);
|
||||
@@ -312,12 +314,12 @@ int sysfs_add_link_to_group(struct kobject *kobj, const char *group_name,
|
||||
struct sysfs_dirent *dir_sd;
|
||||
int error = 0;
|
||||
|
||||
dir_sd = sysfs_get_dirent(kobj->sd, group_name);
|
||||
dir_sd = kernfs_find_and_get(kobj->sd, group_name);
|
||||
if (!dir_sd)
|
||||
return -ENOENT;
|
||||
|
||||
error = sysfs_create_link_sd(dir_sd, target, link_name);
|
||||
sysfs_put(dir_sd);
|
||||
kernfs_put(dir_sd);
|
||||
|
||||
return error;
|
||||
}
|
||||
@@ -334,10 +336,10 @@ void sysfs_remove_link_from_group(struct kobject *kobj, const char *group_name,
|
||||
{
|
||||
struct sysfs_dirent *dir_sd;
|
||||
|
||||
dir_sd = sysfs_get_dirent(kobj->sd, group_name);
|
||||
dir_sd = kernfs_find_and_get(kobj->sd, group_name);
|
||||
if (dir_sd) {
|
||||
kernfs_remove_by_name(dir_sd, link_name);
|
||||
sysfs_put(dir_sd);
|
||||
kernfs_put(dir_sd);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sysfs_remove_link_from_group);
|
||||
|
Reference in New Issue
Block a user