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 vfsmount
* sysfs_mount
;
55 extern struct sysfs_dirent sysfs_root
;
56 extern struct kmem_cache
*sysfs_dir_cachep
;
58 extern struct dentry
*sysfs_get_dentry(struct sysfs_dirent
*sd
);
59 extern void sysfs_link_sibling(struct sysfs_dirent
*sd
);
60 extern void sysfs_unlink_sibling(struct sysfs_dirent
*sd
);
61 extern struct sysfs_dirent
*sysfs_get_active(struct sysfs_dirent
*sd
);
62 extern void sysfs_put_active(struct sysfs_dirent
*sd
);
63 extern struct sysfs_dirent
*sysfs_get_active_two(struct sysfs_dirent
*sd
);
64 extern void sysfs_put_active_two(struct sysfs_dirent
*sd
);
65 extern void sysfs_addrm_start(struct sysfs_addrm_cxt
*acxt
,
66 struct sysfs_dirent
*parent_sd
);
67 extern void sysfs_add_one(struct sysfs_addrm_cxt
*acxt
,
68 struct sysfs_dirent
*sd
);
69 extern void sysfs_remove_one(struct sysfs_addrm_cxt
*acxt
,
70 struct sysfs_dirent
*sd
);
71 extern int sysfs_addrm_finish(struct sysfs_addrm_cxt
*acxt
);
73 extern void sysfs_delete_inode(struct inode
*inode
);
74 extern void sysfs_init_inode(struct sysfs_dirent
*sd
, struct inode
*inode
);
75 extern struct inode
* sysfs_get_inode(struct sysfs_dirent
*sd
);
76 extern void sysfs_instantiate(struct dentry
*dentry
, struct inode
*inode
);
78 extern void release_sysfs_dirent(struct sysfs_dirent
* sd
);
79 extern struct sysfs_dirent
*sysfs_find_dirent(struct sysfs_dirent
*parent_sd
,
80 const unsigned char *name
);
81 extern struct sysfs_dirent
*sysfs_get_dirent(struct sysfs_dirent
*parent_sd
,
82 const unsigned char *name
);
83 extern struct sysfs_dirent
*sysfs_new_dirent(const char *name
, umode_t mode
,
86 extern int sysfs_add_file(struct sysfs_dirent
*dir_sd
,
87 const struct attribute
*attr
, int type
);
88 extern int sysfs_hash_and_remove(struct sysfs_dirent
*dir_sd
, const char *name
);
89 extern struct sysfs_dirent
*sysfs_find(struct sysfs_dirent
*dir
, const char * name
);
91 extern int sysfs_create_subdir(struct kobject
*kobj
, const char *name
,
92 struct sysfs_dirent
**p_sd
);
93 extern void sysfs_remove_subdir(struct sysfs_dirent
*sd
);
95 extern int sysfs_setattr(struct dentry
*dentry
, struct iattr
*iattr
);
97 extern spinlock_t sysfs_assoc_lock
;
98 extern struct mutex sysfs_mutex
;
99 extern struct super_block
* sysfs_sb
;
100 extern const struct file_operations sysfs_dir_operations
;
101 extern const struct file_operations sysfs_file_operations
;
102 extern const struct file_operations bin_fops
;
103 extern const struct inode_operations sysfs_dir_inode_operations
;
104 extern const struct inode_operations sysfs_symlink_inode_operations
;
106 static inline unsigned int sysfs_type(struct sysfs_dirent
*sd
)
108 return sd
->s_flags
& SYSFS_TYPE_MASK
;
111 static inline struct sysfs_dirent
* sysfs_get(struct sysfs_dirent
* sd
)
114 WARN_ON(!atomic_read(&sd
->s_count
));
115 atomic_inc(&sd
->s_count
);
120 static inline void sysfs_put(struct sysfs_dirent
* sd
)
122 if (sd
&& atomic_dec_and_test(&sd
->s_count
))
123 release_sysfs_dirent(sd
);
126 static inline int sysfs_is_shadowed_inode(struct inode
*inode
)
128 return S_ISDIR(inode
->i_mode
) && inode
->i_op
->follow_link
;