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 struct inode
* sysfs_get_inode(struct sysfs_dirent
*sd
);
75 extern void sysfs_instantiate(struct dentry
*dentry
, struct inode
*inode
);
77 extern void release_sysfs_dirent(struct sysfs_dirent
* sd
);
78 extern struct sysfs_dirent
*sysfs_find_dirent(struct sysfs_dirent
*parent_sd
,
79 const unsigned char *name
);
80 extern struct sysfs_dirent
*sysfs_get_dirent(struct sysfs_dirent
*parent_sd
,
81 const unsigned char *name
);
82 extern struct sysfs_dirent
*sysfs_new_dirent(const char *name
, umode_t mode
,
85 extern int sysfs_add_file(struct sysfs_dirent
*dir_sd
,
86 const struct attribute
*attr
, int type
);
87 extern int sysfs_hash_and_remove(struct sysfs_dirent
*dir_sd
, const char *name
);
88 extern struct sysfs_dirent
*sysfs_find(struct sysfs_dirent
*dir
, const char * name
);
90 extern int sysfs_create_subdir(struct kobject
*kobj
, const char *name
,
91 struct sysfs_dirent
**p_sd
);
92 extern void sysfs_remove_subdir(struct sysfs_dirent
*sd
);
94 extern int sysfs_setattr(struct dentry
*dentry
, struct iattr
*iattr
);
96 extern spinlock_t sysfs_assoc_lock
;
97 extern struct mutex sysfs_mutex
;
98 extern struct super_block
* sysfs_sb
;
99 extern const struct file_operations sysfs_dir_operations
;
100 extern const struct file_operations sysfs_file_operations
;
101 extern const struct file_operations bin_fops
;
102 extern const struct inode_operations sysfs_dir_inode_operations
;
103 extern const struct inode_operations sysfs_symlink_inode_operations
;
105 static inline unsigned int sysfs_type(struct sysfs_dirent
*sd
)
107 return sd
->s_flags
& SYSFS_TYPE_MASK
;
110 static inline struct sysfs_dirent
* sysfs_get(struct sysfs_dirent
* sd
)
113 WARN_ON(!atomic_read(&sd
->s_count
));
114 atomic_inc(&sd
->s_count
);
119 static inline void sysfs_put(struct sysfs_dirent
* sd
)
121 if (sd
&& atomic_dec_and_test(&sd
->s_count
))
122 release_sysfs_dirent(sd
);
125 static inline int sysfs_is_shadowed_inode(struct inode
*inode
)
127 return S_ISDIR(inode
->i_mode
) && inode
->i_op
->follow_link
;