aboutsummaryrefslogtreecommitdiffstats
path: root/fs/sysfs/dir.c
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2007-06-13 14:45:18 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2007-07-11 19:09:07 -0400
commitb6b4a4399c2a83d1af77c99dee0d0b5cc15ec268 (patch)
tree7a5d3134a338f03ab813024d5501bde1d434c98b /fs/sysfs/dir.c
parent0b8ead82f5d9d8f08c0d1236f2e350b70a977753 (diff)
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>
Diffstat (limited to 'fs/sysfs/dir.c')
-rw-r--r--fs/sysfs/dir.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c
index 06dff2c30c9b..f5f0b936f181 100644
--- a/fs/sysfs/dir.c
+++ b/fs/sysfs/dir.c
@@ -20,6 +20,94 @@ spinlock_t kobj_sysfs_assoc_lock = SPIN_LOCK_UNLOCKED;
20static spinlock_t sysfs_ino_lock = SPIN_LOCK_UNLOCKED; 20static spinlock_t sysfs_ino_lock = SPIN_LOCK_UNLOCKED;
21static DEFINE_IDA(sysfs_ino_ida); 21static DEFINE_IDA(sysfs_ino_ida);
22 22
23/**
24 * sysfs_get_active - get an active reference to sysfs_dirent
25 * @sd: sysfs_dirent to get an active reference to
26 *
27 * Get an active reference of @sd. This function is noop if @sd
28 * is NULL.
29 *
30 * RETURNS:
31 * Pointer to @sd on success, NULL on failure.
32 */
33struct sysfs_dirent *sysfs_get_active(struct sysfs_dirent *sd)
34{
35 if (sd) {
36 if (unlikely(!down_read_trylock(&sd->s_active)))
37 sd = NULL;
38 }
39 return sd;
40}
41
42/**
43 * sysfs_put_active - put an active reference to sysfs_dirent
44 * @sd: sysfs_dirent to put an active reference to
45 *
46 * Put an active reference to @sd. This function is noop if @sd
47 * is NULL.
48 */
49void sysfs_put_active(struct sysfs_dirent *sd)
50{
51 if (sd)
52 up_read(&sd->s_active);
53}
54
55/**
56 * sysfs_get_active_two - get active references to sysfs_dirent and parent
57 * @sd: sysfs_dirent of interest
58 *
59 * Get active reference to @sd and its parent. Parent's active
60 * reference is grabbed first. This function is noop if @sd is
61 * NULL.
62 *
63 * RETURNS:
64 * Pointer to @sd on success, NULL on failure.
65 */
66struct sysfs_dirent *sysfs_get_active_two(struct sysfs_dirent *sd)
67{
68 if (sd) {
69 if (sd->s_parent && unlikely(!sysfs_get_active(sd->s_parent)))
70 return NULL;
71 if (unlikely(!sysfs_get_active(sd))) {
72 sysfs_put_active(sd->s_parent);
73 return NULL;
74 }
75 }
76 return sd;
77}
78
79/**
80 * sysfs_put_active_two - put active references to sysfs_dirent and parent
81 * @sd: sysfs_dirent of interest
82 *
83 * Put active references to @sd and its parent. This function is
84 * noop if @sd is NULL.
85 */
86void sysfs_put_active_two(struct sysfs_dirent *sd)
87{
88 if (sd) {
89 sysfs_put_active(sd);
90 sysfs_put_active(sd->s_parent);
91 }
92}
93
94/**
95 * sysfs_deactivate - deactivate sysfs_dirent
96 * @sd: sysfs_dirent to deactivate
97 *
98 * Deny new active references and drain existing ones. s_active
99 * will be unlocked when the sysfs_dirent is released.
100 */
101void sysfs_deactivate(struct sysfs_dirent *sd)
102{
103 down_write_nested(&sd->s_active, SYSFS_S_ACTIVE_DEACTIVATE);
104
105 /* s_active will be unlocked by the thread doing the final put
106 * on @sd. Lie to lockdep.
107 */
108 rwsem_release(&sd->s_active.dep_map, 1, _RET_IP_);
109}
110
23static int sysfs_alloc_ino(ino_t *pino) 111static int sysfs_alloc_ino(ino_t *pino)
24{ 112{
25 int ino, rc; 113 int ino, rc;