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 extern struct vfsmount
* sysfs_mount
;
48 extern struct kmem_cache
*sysfs_dir_cachep
;
50 extern struct sysfs_dirent
*sysfs_get_active(struct sysfs_dirent
*sd
);
51 extern void sysfs_put_active(struct sysfs_dirent
*sd
);
52 extern struct sysfs_dirent
*sysfs_get_active_two(struct sysfs_dirent
*sd
);
53 extern void sysfs_put_active_two(struct sysfs_dirent
*sd
);
54 extern void sysfs_deactivate(struct sysfs_dirent
*sd
);
56 extern void sysfs_delete_inode(struct inode
*inode
);
57 extern void sysfs_init_inode(struct sysfs_dirent
*sd
, struct inode
*inode
);
58 extern struct inode
* sysfs_get_inode(struct sysfs_dirent
*sd
);
59 extern void sysfs_instantiate(struct dentry
*dentry
, struct inode
*inode
);
61 extern void release_sysfs_dirent(struct sysfs_dirent
* sd
);
62 extern int sysfs_dirent_exist(struct sysfs_dirent
*, const unsigned char *);
63 extern struct sysfs_dirent
*sysfs_new_dirent(const char *name
, umode_t mode
,
65 extern void sysfs_attach_dirent(struct sysfs_dirent
*sd
,
66 struct sysfs_dirent
*parent_sd
,
67 struct dentry
*dentry
);
69 extern int sysfs_add_file(struct dentry
*, const struct attribute
*, int);
70 extern int sysfs_hash_and_remove(struct dentry
* dir
, const char * name
);
71 extern struct sysfs_dirent
*sysfs_find(struct sysfs_dirent
*dir
, const char * name
);
73 extern int sysfs_create_subdir(struct kobject
*, const char *, struct dentry
**);
74 extern void sysfs_remove_subdir(struct dentry
*);
76 extern void sysfs_drop_dentry(struct sysfs_dirent
*sd
);
77 extern int sysfs_setattr(struct dentry
*dentry
, struct iattr
*iattr
);
79 extern spinlock_t sysfs_lock
;
80 extern spinlock_t kobj_sysfs_assoc_lock
;
81 extern struct rw_semaphore sysfs_rename_sem
;
82 extern struct super_block
* sysfs_sb
;
83 extern const struct file_operations sysfs_dir_operations
;
84 extern const struct file_operations sysfs_file_operations
;
85 extern const struct file_operations bin_fops
;
86 extern const struct inode_operations sysfs_dir_inode_operations
;
87 extern const struct inode_operations sysfs_symlink_inode_operations
;
89 static inline unsigned int sysfs_type(struct sysfs_dirent
*sd
)
91 return sd
->s_flags
& SYSFS_TYPE_MASK
;
94 static inline struct sysfs_dirent
* sysfs_get(struct sysfs_dirent
* sd
)
97 WARN_ON(!atomic_read(&sd
->s_count
));
98 atomic_inc(&sd
->s_count
);
103 static inline void sysfs_put(struct sysfs_dirent
* sd
)
105 if (sd
&& atomic_dec_and_test(&sd
->s_count
))
106 release_sysfs_dirent(sd
);
109 static inline int sysfs_is_shadowed_inode(struct inode
*inode
)
111 return S_ISDIR(inode
->i_mode
) && inode
->i_op
->follow_link
;