From: Tejun Heo <[email protected]> After add/remove path restructuring, the only user of sysfs_drop_dentry() is sysfs_addrm_finish(). Move sysfs_drop_dentry() to dir.c and make it static. Signed-off-by: Tejun Heo <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]> --- fs/sysfs/dir.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/sysfs/inode.c | 56 ------------------------------------------------------ fs/sysfs/sysfs.h | 1 - 3 files changed, 56 insertions(+), 57 deletions(-) diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index edb3062..c6f3b69 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c @@ -435,6 +435,62 @@ void sysfs_remove_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd) } /** + * sysfs_drop_dentry - drop dentry for the specified sysfs_dirent + * @sd: target sysfs_dirent + * + * Drop dentry for @sd. @sd must have been unlinked from its + * parent on entry to this function such that it can't be looked + * up anymore. + * + * @sd->s_dentry which is protected with sysfs_assoc_lock points + * to the currently associated dentry but we're not holding a + * reference to it and racing with dput(). Grab dcache_lock and + * verify dentry before dropping it. If @sd->s_dentry is NULL or + * dput() beats us, no need to bother. + */ +static void sysfs_drop_dentry(struct sysfs_dirent *sd) +{ + struct dentry *dentry = NULL; + struct inode *inode; + + /* We're not holding a reference to ->s_dentry dentry but the + * field will stay valid as long as sysfs_assoc_lock is held. + */ + spin_lock(&sysfs_assoc_lock); + spin_lock(&dcache_lock); + + /* drop dentry if it's there and dput() didn't kill it yet */ + if (sd->s_dentry && sd->s_dentry->d_inode) { + dentry = dget_locked(sd->s_dentry); + spin_lock(&dentry->d_lock); + __d_drop(dentry); + spin_unlock(&dentry->d_lock); + } + + spin_unlock(&dcache_lock); + spin_unlock(&sysfs_assoc_lock); + + dput(dentry); + /* XXX: unpin if directory, this will go away soon */ + if (sysfs_type(sd) == SYSFS_DIR) + dput(dentry); + + /* adjust nlink and update timestamp */ + inode = ilookup(sysfs_sb, sd->s_ino); + if (inode) { + mutex_lock(&inode->i_mutex); + + inode->i_ctime = CURRENT_TIME; + drop_nlink(inode); + if (sysfs_type(sd) == SYSFS_DIR) + drop_nlink(inode); + + mutex_unlock(&inode->i_mutex); + iput(inode); + } +} + +/** * sysfs_addrm_finish - finish up sysfs_dirent add/remove * @acxt: addrm context to finish up * diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c index f959668..3756e15 100644 --- a/fs/sysfs/inode.c +++ b/fs/sysfs/inode.c @@ -197,62 +197,6 @@ void sysfs_instantiate(struct dentry *dentry, struct inode *inode) d_instantiate(dentry, inode); } -/** - * sysfs_drop_dentry - drop dentry for the specified sysfs_dirent - * @sd: target sysfs_dirent - * - * Drop dentry for @sd. @sd must have been unlinked from its - * parent on entry to this function such that it can't be looked - * up anymore. - * - * @sd->s_dentry which is protected with sysfs_assoc_lock points - * to the currently associated dentry but we're not holding a - * reference to it and racing with dput(). Grab dcache_lock and - * verify dentry before dropping it. If @sd->s_dentry is NULL or - * dput() beats us, no need to bother. - */ -void sysfs_drop_dentry(struct sysfs_dirent *sd) -{ - struct dentry *dentry = NULL; - struct inode *inode; - - /* We're not holding a reference to ->s_dentry dentry but the - * field will stay valid as long as sysfs_assoc_lock is held. - */ - spin_lock(&sysfs_assoc_lock); - spin_lock(&dcache_lock); - - /* drop dentry if it's there and dput() didn't kill it yet */ - if (sd->s_dentry && sd->s_dentry->d_inode) { - dentry = dget_locked(sd->s_dentry); - spin_lock(&dentry->d_lock); - __d_drop(dentry); - spin_unlock(&dentry->d_lock); - } - - spin_unlock(&dcache_lock); - spin_unlock(&sysfs_assoc_lock); - - dput(dentry); - /* XXX: unpin if directory, this will go away soon */ - if (sysfs_type(sd) == SYSFS_DIR) - dput(dentry); - - /* adjust nlink and update timestamp */ - inode = ilookup(sysfs_sb, sd->s_ino); - if (inode) { - mutex_lock(&inode->i_mutex); - - inode->i_ctime = CURRENT_TIME; - drop_nlink(inode); - if (sysfs_type(sd) == SYSFS_DIR) - drop_nlink(inode); - - mutex_unlock(&inode->i_mutex); - iput(inode); - } -} - int sysfs_hash_and_remove(struct sysfs_dirent *dir_sd, const char *name) { struct sysfs_addrm_cxt acxt; diff --git a/fs/sysfs/sysfs.h b/fs/sysfs/sysfs.h index 3e9a5ee..92fe1e5 100644 --- a/fs/sysfs/sysfs.h +++ b/fs/sysfs/sysfs.h @@ -90,7 +90,6 @@ extern int sysfs_create_subdir(struct kobject *kobj, const char *name, struct sysfs_dirent **p_sd); extern void sysfs_remove_subdir(struct sysfs_dirent *sd); -extern void sysfs_drop_dentry(struct sysfs_dirent *sd); extern int sysfs_setattr(struct dentry *dentry, struct iattr *iattr); extern spinlock_t sysfs_assoc_lock; -- 1.5.2.2 - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
- Follow-Ups:
- [PATCH 59/61] sysfs: implement sysfs_get_dentry()
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 59/61] sysfs: implement sysfs_get_dentry()
- References:
- [GIT PATCH] sysfs and driver core patches for 2.6.22
- From: Greg KH <[email protected]>
- [PATCH 01/61] Rules on how to use sysfs in userspace programs
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 02/61] debugfs: add rename for debugfs files
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 03/61] DMI-based module autoloading
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 04/61] Driver core: add missing kset uevent
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 05/61] sysdev: use mutex instead of semaphore
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 06/61] Power Management: use mutexes instead of semaphores
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 07/61] PM: Remove pm_parent from struct dev_pm_info
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 08/61] PM: Remove saved_state from struct dev_pm_info
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 09/61] PM: Simplify suspend_device
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 10/61] Driver core: include linux/mutex.h from attribute_container.c
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 11/61] driver core: properly get driver in device_release_driver
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 12/61] driver core: fix kernel doc of device_release_driver
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 13/61] Driver core: fix devres_release_all() return value
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 14/61] PM: Remove prev_state from struct dev_pm_info
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 15/61] PM: Remove power_state.event checks from suspend core code
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 16/61] PM: Do not check parent state in suspend and resume core code
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 17/61] PM: do not use saved_state from struct dev_pm_info on ARM
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 18/61] Driver core: coding style cleanup
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 19/61] idr: fix obscure bug in allocation path
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 20/61] idr: separate out idr_mark_full()
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 21/61] ida: implement idr based id allocator
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 22/61] sysfs: move release_sysfs_dirent() to dir.c
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 23/61] sysfs: allocate inode number using ida
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 24/61] sysfs: make sysfs_put() ignore NULL sd
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 25/61] sysfs: fix error handling in binattr write()
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 26/61] sysfs: flatten cleanup paths in sysfs_add_link() and create_dir()
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 27/61] sysfs: flatten and fix sysfs_rename_dir() error handling
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 28/61] sysfs: consolidate sysfs_dirent creation functions
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 29/61] sysfs: add sysfs_dirent->s_parent
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 30/61] sysfs: add sysfs_dirent->s_name
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 31/61] sysfs: make sysfs_dirent->s_element a union
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 32/61] sysfs: implement kobj_sysfs_assoc_lock
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 33/61] sysfs: reimplement symlink using sysfs_dirent tree
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 34/61] sysfs: implement bin_buffer
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 35/61] sysfs: implement sysfs_dirent active reference and immediate disconnect
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 36/61] sysfs: kill attribute file orphaning
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 37/61] sysfs: separate out sysfs_attach_dentry()
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 38/61] sysfs: reimplement sysfs_drop_dentry()
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 39/61] sysfs: kill unnecessary attribute->owner
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 40/61] driver-core: make devt_attr and uevent_attr static
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 41/61] sysfs: make sysfs_alloc_ino() static
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 42/61] sysfs: fix parent refcounting during rename and move
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 43/61] sysfs: reorganize sysfs_new_indoe() and sysfs_create()
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 44/61] sysfs: use iget_locked() instead of new_inode()
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 45/61] sysfs: fix root sysfs_dirent -> root dentry association
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 46/61] sysfs: move s_active functions to fs/sysfs/dir.c
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 47/61] sysfs: slim down sysfs_dirent->s_active
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 48/61] sysfs: use singly-linked list for sysfs_dirent tree
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 49/61] sysfs: Fix oops in sysfs_drop_dentry on x86_64
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 50/61] sysfs: make sysfs_drop_dentry() access inodes using ilookup()
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 51/61] sysfs: rename sysfs_dirent->s_type to s_flags and make room for flags
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 52/61] sysfs: implement SYSFS_FLAG_REMOVED flag
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 53/61] sysfs: implement sysfs_find_dirent() and sysfs_get_dirent()
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 54/61] sysfs: make kobj point to sysfs_dirent instead of dentry
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 55/61] sysfs: consolidate sysfs spinlocks
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 56/61] sysfs: use sysfs_mutex to protect the sysfs_dirent tree
- From: Greg Kroah-Hartman <[email protected]>
- [PATCH 57/61] sysfs: restructure add/remove paths and fix inode update
- From: Greg Kroah-Hartman <[email protected]>
- [GIT PATCH] sysfs and driver core patches for 2.6.22
- Prev by Date: [PATCH 57/61] sysfs: restructure add/remove paths and fix inode update
- Next by Date: [PATCH 59/61] sysfs: implement sysfs_get_dentry()
- Previous by thread: [PATCH 57/61] sysfs: restructure add/remove paths and fix inode update
- Next by thread: [PATCH 59/61] sysfs: implement sysfs_get_dentry()
- Index(es):