1 struct sysfs_elem_dir
{
5 struct sysfs_elem_symlink
{
6 struct sysfs_dirent
* target_sd
;
9 struct sysfs_elem_attr
{
10 struct attribute
* attr
;
13 struct sysfs_elem_bin_attr
{
14 struct bin_attribute
* bin_attr
;
18 * As long as s_count reference is held, the sysfs_dirent itself is
19 * accessible. Dereferencing s_elem or any other outer entity
20 * requires s_active reference.
25 struct sysfs_dirent
* s_parent
;
26 struct sysfs_dirent
* s_sibling
;
27 struct sysfs_dirent
* s_children
;
31 struct sysfs_elem_dir dir
;
32 struct sysfs_elem_symlink symlink
;
33 struct sysfs_elem_attr attr
;
34 struct sysfs_elem_bin_attr bin_attr
;
40 struct dentry
* s_dentry
;
41 struct iattr
* s_iattr
;
45 #define SD_DEACTIVATED_BIAS INT_MIN
47 struct sysfs_addrm_cxt
{
48 struct sysfs_dirent
*parent_sd
;
49 struct inode
*parent_inode
;
50 struct sysfs_dirent
*removed
;
54 extern struct sysfs_dirent sysfs_root
;
55 extern struct kmem_cache
*sysfs_dir_cachep
;
57 extern struct dentry
*sysfs_get_dentry(struct sysfs_dirent
*sd
);
58 extern struct sysfs_dirent
*sysfs_get_active(struct sysfs_dirent
*sd
);
59 extern void sysfs_put_active(struct sysfs_dirent
*sd
);
60 extern struct sysfs_dirent
*sysfs_get_active_two(struct sysfs_dirent
*sd
);
61 extern void sysfs_put_active_two(struct sysfs_dirent
*sd
);
62 extern void sysfs_addrm_start(struct sysfs_addrm_cxt
*acxt
,
63 struct sysfs_dirent
*parent_sd
);
64 extern int sysfs_add_one(struct sysfs_addrm_cxt
*acxt
,
65 struct sysfs_dirent
*sd
);
66 extern void sysfs_remove_one(struct sysfs_addrm_cxt
*acxt
,
67 struct sysfs_dirent
*sd
);
68 extern void sysfs_addrm_finish(struct sysfs_addrm_cxt
*acxt
);
70 extern struct inode
* sysfs_get_inode(struct sysfs_dirent
*sd
);
72 extern void release_sysfs_dirent(struct sysfs_dirent
* sd
);
73 extern struct sysfs_dirent
*sysfs_find_dirent(struct sysfs_dirent
*parent_sd
,
74 const unsigned char *name
);
75 extern struct sysfs_dirent
*sysfs_get_dirent(struct sysfs_dirent
*parent_sd
,
76 const unsigned char *name
);
77 extern struct sysfs_dirent
*sysfs_new_dirent(const char *name
, umode_t mode
,
80 extern int sysfs_add_file(struct sysfs_dirent
*dir_sd
,
81 const struct attribute
*attr
, int type
);
82 extern int sysfs_hash_and_remove(struct sysfs_dirent
*dir_sd
, const char *name
);
83 extern struct sysfs_dirent
*sysfs_find(struct sysfs_dirent
*dir
, const char * name
);
85 extern int sysfs_create_subdir(struct kobject
*kobj
, const char *name
,
86 struct sysfs_dirent
**p_sd
);
87 extern void sysfs_remove_subdir(struct sysfs_dirent
*sd
);
89 extern int sysfs_setattr(struct dentry
*dentry
, struct iattr
*iattr
);
91 extern spinlock_t sysfs_assoc_lock
;
92 extern struct mutex sysfs_mutex
;
93 extern struct mutex sysfs_rename_mutex
;
94 extern struct super_block
* sysfs_sb
;
95 extern const struct file_operations sysfs_dir_operations
;
96 extern const struct file_operations sysfs_file_operations
;
97 extern const struct file_operations bin_fops
;
98 extern const struct inode_operations sysfs_dir_inode_operations
;
99 extern const struct inode_operations sysfs_symlink_inode_operations
;
101 static inline unsigned int sysfs_type(struct sysfs_dirent
*sd
)
103 return sd
->s_flags
& SYSFS_TYPE_MASK
;
106 static inline struct sysfs_dirent
* sysfs_get(struct sysfs_dirent
* sd
)
109 WARN_ON(!atomic_read(&sd
->s_count
));
110 atomic_inc(&sd
->s_count
);
115 static inline void sysfs_put(struct sysfs_dirent
* sd
)
117 if (sd
&& atomic_dec_and_test(&sd
->s_count
))
118 release_sysfs_dirent(sd
);