sysfs: move s_active functions to fs/sysfs/dir.c
These functions are about to receive more complexity and doesn't really need to be inlined in the first place. Move them from fs/sysfs/sysfs.h to fs/sysfs/dir.c. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
0b8ead82f5
commit
b6b4a4399c
|
@ -20,6 +20,94 @@ spinlock_t kobj_sysfs_assoc_lock = SPIN_LOCK_UNLOCKED;
|
||||||
static spinlock_t sysfs_ino_lock = SPIN_LOCK_UNLOCKED;
|
static spinlock_t sysfs_ino_lock = SPIN_LOCK_UNLOCKED;
|
||||||
static DEFINE_IDA(sysfs_ino_ida);
|
static DEFINE_IDA(sysfs_ino_ida);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sysfs_get_active - get an active reference to sysfs_dirent
|
||||||
|
* @sd: sysfs_dirent to get an active reference to
|
||||||
|
*
|
||||||
|
* Get an active reference of @sd. This function is noop if @sd
|
||||||
|
* is NULL.
|
||||||
|
*
|
||||||
|
* RETURNS:
|
||||||
|
* Pointer to @sd on success, NULL on failure.
|
||||||
|
*/
|
||||||
|
struct sysfs_dirent *sysfs_get_active(struct sysfs_dirent *sd)
|
||||||
|
{
|
||||||
|
if (sd) {
|
||||||
|
if (unlikely(!down_read_trylock(&sd->s_active)))
|
||||||
|
sd = NULL;
|
||||||
|
}
|
||||||
|
return sd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sysfs_put_active - put an active reference to sysfs_dirent
|
||||||
|
* @sd: sysfs_dirent to put an active reference to
|
||||||
|
*
|
||||||
|
* Put an active reference to @sd. This function is noop if @sd
|
||||||
|
* is NULL.
|
||||||
|
*/
|
||||||
|
void sysfs_put_active(struct sysfs_dirent *sd)
|
||||||
|
{
|
||||||
|
if (sd)
|
||||||
|
up_read(&sd->s_active);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sysfs_get_active_two - get active references to sysfs_dirent and parent
|
||||||
|
* @sd: sysfs_dirent of interest
|
||||||
|
*
|
||||||
|
* Get active reference to @sd and its parent. Parent's active
|
||||||
|
* reference is grabbed first. This function is noop if @sd is
|
||||||
|
* NULL.
|
||||||
|
*
|
||||||
|
* RETURNS:
|
||||||
|
* Pointer to @sd on success, NULL on failure.
|
||||||
|
*/
|
||||||
|
struct sysfs_dirent *sysfs_get_active_two(struct sysfs_dirent *sd)
|
||||||
|
{
|
||||||
|
if (sd) {
|
||||||
|
if (sd->s_parent && unlikely(!sysfs_get_active(sd->s_parent)))
|
||||||
|
return NULL;
|
||||||
|
if (unlikely(!sysfs_get_active(sd))) {
|
||||||
|
sysfs_put_active(sd->s_parent);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sysfs_put_active_two - put active references to sysfs_dirent and parent
|
||||||
|
* @sd: sysfs_dirent of interest
|
||||||
|
*
|
||||||
|
* Put active references to @sd and its parent. This function is
|
||||||
|
* noop if @sd is NULL.
|
||||||
|
*/
|
||||||
|
void sysfs_put_active_two(struct sysfs_dirent *sd)
|
||||||
|
{
|
||||||
|
if (sd) {
|
||||||
|
sysfs_put_active(sd);
|
||||||
|
sysfs_put_active(sd->s_parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sysfs_deactivate - deactivate sysfs_dirent
|
||||||
|
* @sd: sysfs_dirent to deactivate
|
||||||
|
*
|
||||||
|
* Deny new active references and drain existing ones. s_active
|
||||||
|
* will be unlocked when the sysfs_dirent is released.
|
||||||
|
*/
|
||||||
|
void sysfs_deactivate(struct sysfs_dirent *sd)
|
||||||
|
{
|
||||||
|
down_write_nested(&sd->s_active, SYSFS_S_ACTIVE_DEACTIVATE);
|
||||||
|
|
||||||
|
/* s_active will be unlocked by the thread doing the final put
|
||||||
|
* on @sd. Lie to lockdep.
|
||||||
|
*/
|
||||||
|
rwsem_release(&sd->s_active.dep_map, 1, _RET_IP_);
|
||||||
|
}
|
||||||
|
|
||||||
static int sysfs_alloc_ino(ino_t *pino)
|
static int sysfs_alloc_ino(ino_t *pino)
|
||||||
{
|
{
|
||||||
int ino, rc;
|
int ino, rc;
|
||||||
|
|
|
@ -56,6 +56,12 @@ enum sysfs_s_active_class
|
||||||
extern struct vfsmount * sysfs_mount;
|
extern struct vfsmount * sysfs_mount;
|
||||||
extern struct kmem_cache *sysfs_dir_cachep;
|
extern struct kmem_cache *sysfs_dir_cachep;
|
||||||
|
|
||||||
|
extern struct sysfs_dirent *sysfs_get_active(struct sysfs_dirent *sd);
|
||||||
|
extern void sysfs_put_active(struct sysfs_dirent *sd);
|
||||||
|
extern struct sysfs_dirent *sysfs_get_active_two(struct sysfs_dirent *sd);
|
||||||
|
extern void sysfs_put_active_two(struct sysfs_dirent *sd);
|
||||||
|
extern void sysfs_deactivate(struct sysfs_dirent *sd);
|
||||||
|
|
||||||
extern void sysfs_delete_inode(struct inode *inode);
|
extern void sysfs_delete_inode(struct inode *inode);
|
||||||
extern void sysfs_init_inode(struct sysfs_dirent *sd, struct inode *inode);
|
extern void sysfs_init_inode(struct sysfs_dirent *sd, struct inode *inode);
|
||||||
extern struct inode * sysfs_get_inode(struct sysfs_dirent *sd);
|
extern struct inode * sysfs_get_inode(struct sysfs_dirent *sd);
|
||||||
|
@ -104,94 +110,6 @@ static inline void sysfs_put(struct sysfs_dirent * sd)
|
||||||
release_sysfs_dirent(sd);
|
release_sysfs_dirent(sd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* sysfs_get_active - get an active reference to sysfs_dirent
|
|
||||||
* @sd: sysfs_dirent to get an active reference to
|
|
||||||
*
|
|
||||||
* Get an active reference of @sd. This function is noop if @sd
|
|
||||||
* is NULL.
|
|
||||||
*
|
|
||||||
* RETURNS:
|
|
||||||
* Pointer to @sd on success, NULL on failure.
|
|
||||||
*/
|
|
||||||
static inline struct sysfs_dirent *sysfs_get_active(struct sysfs_dirent *sd)
|
|
||||||
{
|
|
||||||
if (sd) {
|
|
||||||
if (unlikely(!down_read_trylock(&sd->s_active)))
|
|
||||||
sd = NULL;
|
|
||||||
}
|
|
||||||
return sd;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* sysfs_put_active - put an active reference to sysfs_dirent
|
|
||||||
* @sd: sysfs_dirent to put an active reference to
|
|
||||||
*
|
|
||||||
* Put an active reference to @sd. This function is noop if @sd
|
|
||||||
* is NULL.
|
|
||||||
*/
|
|
||||||
static inline void sysfs_put_active(struct sysfs_dirent *sd)
|
|
||||||
{
|
|
||||||
if (sd)
|
|
||||||
up_read(&sd->s_active);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* sysfs_get_active_two - get active references to sysfs_dirent and parent
|
|
||||||
* @sd: sysfs_dirent of interest
|
|
||||||
*
|
|
||||||
* Get active reference to @sd and its parent. Parent's active
|
|
||||||
* reference is grabbed first. This function is noop if @sd is
|
|
||||||
* NULL.
|
|
||||||
*
|
|
||||||
* RETURNS:
|
|
||||||
* Pointer to @sd on success, NULL on failure.
|
|
||||||
*/
|
|
||||||
static inline struct sysfs_dirent *sysfs_get_active_two(struct sysfs_dirent *sd)
|
|
||||||
{
|
|
||||||
if (sd) {
|
|
||||||
if (sd->s_parent && unlikely(!sysfs_get_active(sd->s_parent)))
|
|
||||||
return NULL;
|
|
||||||
if (unlikely(!sysfs_get_active(sd))) {
|
|
||||||
sysfs_put_active(sd->s_parent);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sd;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* sysfs_put_active_two - put active references to sysfs_dirent and parent
|
|
||||||
* @sd: sysfs_dirent of interest
|
|
||||||
*
|
|
||||||
* Put active references to @sd and its parent. This function is
|
|
||||||
* noop if @sd is NULL.
|
|
||||||
*/
|
|
||||||
static inline void sysfs_put_active_two(struct sysfs_dirent *sd)
|
|
||||||
{
|
|
||||||
if (sd) {
|
|
||||||
sysfs_put_active(sd);
|
|
||||||
sysfs_put_active(sd->s_parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* sysfs_deactivate - deactivate sysfs_dirent
|
|
||||||
* @sd: sysfs_dirent to deactivate
|
|
||||||
*
|
|
||||||
* Deny new active references and drain existing ones. s_active
|
|
||||||
* will be unlocked when the sysfs_dirent is released.
|
|
||||||
*/
|
|
||||||
static inline void sysfs_deactivate(struct sysfs_dirent *sd)
|
|
||||||
{
|
|
||||||
down_write_nested(&sd->s_active, SYSFS_S_ACTIVE_DEACTIVATE);
|
|
||||||
|
|
||||||
/* s_active will be unlocked by the thread doing the final put
|
|
||||||
* on @sd. Lie to lockdep.
|
|
||||||
*/
|
|
||||||
rwsem_release(&sd->s_active.dep_map, 1, _RET_IP_);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int sysfs_is_shadowed_inode(struct inode *inode)
|
static inline int sysfs_is_shadowed_inode(struct inode *inode)
|
||||||
{
|
{
|
||||||
return S_ISDIR(inode->i_mode) && inode->i_op->follow_link;
|
return S_ISDIR(inode->i_mode) && inode->i_op->follow_link;
|
||||||
|
|
Loading…
Reference in New Issue