From: Tejun Heo <htejun@gmail.com> Implement sysfs_find_dirent() and sysfs_get_dirent(). sysfs_dirent_exist() is replaced by sysfs_find_dirent(). These will be used to make directory entries reclamiable. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> --- fs/sysfs/dir.c | 61 +++++++++++++++++++++++++++++++++++++-------------- fs/sysfs/file.c | 2 +- fs/sysfs/symlink.c | 2 +- fs/sysfs/sysfs.h | 5 +++- 4 files changed, 50 insertions(+), 20 deletions(-) diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index f2ea006..4762a9a 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c @@ -317,28 +317,55 @@ void sysfs_attach_dirent(struct sysfs_dirent *sd, } } -/* +/** + * sysfs_find_dirent - find sysfs_dirent with the given name + * @parent_sd: sysfs_dirent to search under + * @name: name to look for * - * Return -EEXIST if there is already a sysfs element with the same name for - * the same parent. + * Look for sysfs_dirent with name @name under @parent_sd. * - * called with parent inode's i_mutex held + * LOCKING: + * mutex_lock(parent->i_mutex) + * + * RETURNS: + * Pointer to sysfs_dirent if found, NULL if not. */ -int sysfs_dirent_exist(struct sysfs_dirent *parent_sd, - const unsigned char *new) +struct sysfs_dirent *sysfs_find_dirent(struct sysfs_dirent *parent_sd, + const unsigned char *name) { - struct sysfs_dirent * sd; + struct sysfs_dirent *sd; - for (sd = parent_sd->s_children; sd; sd = sd->s_sibling) { - if (sysfs_type(sd)) { - if (strcmp(sd->s_name, new)) - continue; - else - return -EEXIST; - } - } + for (sd = parent_sd->s_children; sd; sd = sd->s_sibling) + if (sysfs_type(sd) && !strcmp(sd->s_name, name)) + return sd; + return NULL; +} - return 0; +/** + * sysfs_get_dirent - find and get sysfs_dirent with the given name + * @parent_sd: sysfs_dirent to search under + * @name: name to look for + * + * Look for sysfs_dirent with name @name under @parent_sd and get + * it if found. + * + * LOCKING: + * Kernel thread context (may sleep) + * + * RETURNS: + * Pointer to sysfs_dirent if found, NULL if not. + */ +struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd, + const unsigned char *name) +{ + struct sysfs_dirent *sd; + + mutex_lock(&parent_sd->s_dentry->d_inode->i_mutex); + sd = sysfs_find_dirent(parent_sd, name); + sysfs_get(sd); + mutex_unlock(&parent_sd->s_dentry->d_inode->i_mutex); + + return sd; } static int create_dir(struct kobject *kobj, struct dentry *parent, @@ -382,7 +409,7 @@ static int create_dir(struct kobject *kobj, struct dentry *parent, /* link in */ error = -EEXIST; - if (sysfs_dirent_exist(parent->d_fsdata, name)) + if (sysfs_find_dirent(parent->d_fsdata, name)) goto out_iput; sysfs_instantiate(dentry, inode); diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c index a84b734..e448b88 100644 --- a/fs/sysfs/file.c +++ b/fs/sysfs/file.c @@ -421,7 +421,7 @@ int sysfs_add_file(struct dentry * dir, const struct attribute * attr, int type) mutex_lock(&dir->d_inode->i_mutex); - if (sysfs_dirent_exist(parent_sd, attr->name)) { + if (sysfs_find_dirent(parent_sd, attr->name)) { error = -EEXIST; goto out_unlock; } diff --git a/fs/sysfs/symlink.c b/fs/sysfs/symlink.c index ff605d3..45b62e2 100644 --- a/fs/sysfs/symlink.c +++ b/fs/sysfs/symlink.c @@ -95,7 +95,7 @@ int sysfs_create_link(struct kobject * kobj, struct kobject * target, const char return -ENOENT; mutex_lock(&dentry->d_inode->i_mutex); - if (!sysfs_dirent_exist(dentry->d_fsdata, name)) + if (!sysfs_find_dirent(dentry->d_fsdata, name)) error = sysfs_add_link(parent_sd, name, target_sd); mutex_unlock(&dentry->d_inode->i_mutex); diff --git a/fs/sysfs/sysfs.h b/fs/sysfs/sysfs.h index 06b5085..f1629b4 100644 --- a/fs/sysfs/sysfs.h +++ b/fs/sysfs/sysfs.h @@ -59,7 +59,10 @@ extern struct inode * sysfs_get_inode(struct sysfs_dirent *sd); extern void sysfs_instantiate(struct dentry *dentry, struct inode *inode); extern void release_sysfs_dirent(struct sysfs_dirent * sd); -extern int sysfs_dirent_exist(struct sysfs_dirent *, const unsigned char *); +extern struct sysfs_dirent *sysfs_find_dirent(struct sysfs_dirent *parent_sd, + const unsigned char *name); +extern struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd, + const unsigned char *name); extern struct sysfs_dirent *sysfs_new_dirent(const char *name, umode_t mode, int type); extern void sysfs_attach_dirent(struct sysfs_dirent *sd, -- 1.5.2.2 - 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/
- Follow-Ups:
- [PATCH 54/61] sysfs: make kobj point to sysfs_dirent instead of dentry
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 54/61] sysfs: make kobj point to sysfs_dirent instead of dentry
- References:
- [GIT PATCH] sysfs and driver core patches for 2.6.22
- From: Greg KH <gregkh@suse.de>
- [PATCH 01/61] Rules on how to use sysfs in userspace programs
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 02/61] debugfs: add rename for debugfs files
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 03/61] DMI-based module autoloading
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 04/61] Driver core: add missing kset uevent
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 05/61] sysdev: use mutex instead of semaphore
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 06/61] Power Management: use mutexes instead of semaphores
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 07/61] PM: Remove pm_parent from struct dev_pm_info
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 08/61] PM: Remove saved_state from struct dev_pm_info
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 09/61] PM: Simplify suspend_device
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 10/61] Driver core: include linux/mutex.h from attribute_container.c
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 11/61] driver core: properly get driver in device_release_driver
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 12/61] driver core: fix kernel doc of device_release_driver
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 13/61] Driver core: fix devres_release_all() return value
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 14/61] PM: Remove prev_state from struct dev_pm_info
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 15/61] PM: Remove power_state.event checks from suspend core code
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 16/61] PM: Do not check parent state in suspend and resume core code
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 17/61] PM: do not use saved_state from struct dev_pm_info on ARM
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 18/61] Driver core: coding style cleanup
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 19/61] idr: fix obscure bug in allocation path
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 20/61] idr: separate out idr_mark_full()
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 21/61] ida: implement idr based id allocator
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 22/61] sysfs: move release_sysfs_dirent() to dir.c
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 23/61] sysfs: allocate inode number using ida
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 24/61] sysfs: make sysfs_put() ignore NULL sd
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 25/61] sysfs: fix error handling in binattr write()
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 26/61] sysfs: flatten cleanup paths in sysfs_add_link() and create_dir()
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 27/61] sysfs: flatten and fix sysfs_rename_dir() error handling
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 28/61] sysfs: consolidate sysfs_dirent creation functions
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 29/61] sysfs: add sysfs_dirent->s_parent
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 30/61] sysfs: add sysfs_dirent->s_name
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 31/61] sysfs: make sysfs_dirent->s_element a union
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 32/61] sysfs: implement kobj_sysfs_assoc_lock
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 33/61] sysfs: reimplement symlink using sysfs_dirent tree
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 34/61] sysfs: implement bin_buffer
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 35/61] sysfs: implement sysfs_dirent active reference and immediate disconnect
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 36/61] sysfs: kill attribute file orphaning
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 37/61] sysfs: separate out sysfs_attach_dentry()
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 38/61] sysfs: reimplement sysfs_drop_dentry()
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 39/61] sysfs: kill unnecessary attribute->owner
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 40/61] driver-core: make devt_attr and uevent_attr static
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 41/61] sysfs: make sysfs_alloc_ino() static
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 42/61] sysfs: fix parent refcounting during rename and move
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 43/61] sysfs: reorganize sysfs_new_indoe() and sysfs_create()
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 44/61] sysfs: use iget_locked() instead of new_inode()
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 45/61] sysfs: fix root sysfs_dirent -> root dentry association
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 46/61] sysfs: move s_active functions to fs/sysfs/dir.c
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 47/61] sysfs: slim down sysfs_dirent->s_active
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 48/61] sysfs: use singly-linked list for sysfs_dirent tree
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 49/61] sysfs: Fix oops in sysfs_drop_dentry on x86_64
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 50/61] sysfs: make sysfs_drop_dentry() access inodes using ilookup()
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 51/61] sysfs: rename sysfs_dirent->s_type to s_flags and make room for flags
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [PATCH 52/61] sysfs: implement SYSFS_FLAG_REMOVED flag
- From: Greg Kroah-Hartman <gregkh@suse.de>
- [GIT PATCH] sysfs and driver core patches for 2.6.22
- Prev by Date: [PATCH 52/61] sysfs: implement SYSFS_FLAG_REMOVED flag
- Next by Date: [PATCH 54/61] sysfs: make kobj point to sysfs_dirent instead of dentry
- Previous by thread: [PATCH 52/61] sysfs: implement SYSFS_FLAG_REMOVED flag
- Next by thread: [PATCH 54/61] sysfs: make kobj point to sysfs_dirent instead of dentry
- Index(es):
![]() |