2007-02-16 16:35:25 +03:00
struct sysfs_dirent {
atomic_t s_count ;
struct list_head s_sibling ;
struct list_head s_children ;
void * s_element ;
int s_type ;
umode_t s_mode ;
2007-06-11 09:02:45 +04:00
ino_t s_ino ;
2007-02-16 16:35:25 +03:00
struct dentry * s_dentry ;
struct iattr * s_iattr ;
atomic_t s_event ;
} ;
2005-04-17 02:20:36 +04:00
extern struct vfsmount * sysfs_mount ;
2006-12-07 07:33:20 +03:00
extern struct kmem_cache * sysfs_dir_cachep ;
2005-04-17 02:20:36 +04:00
2007-01-24 22:35:52 +03:00
extern void sysfs_delete_inode ( struct inode * inode ) ;
2005-05-31 09:09:52 +04:00
extern struct inode * sysfs_new_inode ( mode_t mode , struct sysfs_dirent * ) ;
2005-04-17 02:20:36 +04:00
extern int sysfs_create ( struct dentry * , int mode , int ( * init ) ( struct inode * ) ) ;
2007-06-13 22:45:13 +04:00
extern void release_sysfs_dirent ( struct sysfs_dirent * sd ) ;
2006-03-09 17:10:14 +03:00
extern int sysfs_dirent_exist ( struct sysfs_dirent * , const unsigned char * ) ;
2007-06-13 22:45:14 +04:00
extern struct sysfs_dirent * sysfs_new_dirent ( void * element , umode_t mode ,
int type ) ;
extern void sysfs_attach_dirent ( struct sysfs_dirent * sd ,
struct sysfs_dirent * parent_sd ,
struct dentry * dentry ) ;
2005-04-17 02:20:36 +04:00
extern int sysfs_add_file ( struct dentry * , const struct attribute * , int ) ;
2006-07-11 10:05:25 +04:00
extern int sysfs_hash_and_remove ( struct dentry * dir , const char * name ) ;
2006-03-20 09:53:53 +03:00
extern struct sysfs_dirent * sysfs_find ( struct sysfs_dirent * dir , const char * name ) ;
2005-04-17 02:20:36 +04:00
extern int sysfs_create_subdir ( struct kobject * , const char * , struct dentry * * ) ;
extern void sysfs_remove_subdir ( struct dentry * ) ;
extern const unsigned char * sysfs_get_name ( struct sysfs_dirent * sd ) ;
extern void sysfs_drop_dentry ( struct sysfs_dirent * sd , struct dentry * parent ) ;
2005-05-31 09:09:14 +04:00
extern int sysfs_setattr ( struct dentry * dentry , struct iattr * iattr ) ;
2005-04-17 02:20:36 +04:00
2007-06-11 09:04:01 +04:00
extern spinlock_t sysfs_lock ;
2005-04-17 02:20:36 +04:00
extern struct rw_semaphore sysfs_rename_sem ;
extern struct super_block * sysfs_sb ;
2006-03-28 13:56:42 +04:00
extern const struct file_operations sysfs_dir_operations ;
extern const struct file_operations sysfs_file_operations ;
extern const struct file_operations bin_fops ;
2007-02-12 11:55:40 +03:00
extern const struct inode_operations sysfs_dir_inode_operations ;
extern const struct inode_operations sysfs_symlink_inode_operations ;
2005-04-17 02:20:36 +04:00
struct sysfs_symlink {
char * link_name ;
struct kobject * target_kobj ;
} ;
2006-12-20 12:52:44 +03:00
struct sysfs_buffer {
struct list_head associates ;
size_t count ;
loff_t pos ;
char * page ;
struct sysfs_ops * ops ;
struct semaphore sem ;
int orphaned ;
int needs_read_fill ;
int event ;
} ;
struct sysfs_buffer_collection {
struct list_head associates ;
} ;
2005-04-17 02:20:36 +04:00
static inline struct kobject * to_kobj ( struct dentry * dentry )
{
struct sysfs_dirent * sd = dentry - > d_fsdata ;
return ( ( struct kobject * ) sd - > s_element ) ;
}
static inline struct attribute * to_attr ( struct dentry * dentry )
{
struct sysfs_dirent * sd = dentry - > d_fsdata ;
return ( ( struct attribute * ) sd - > s_element ) ;
}
static inline struct bin_attribute * to_bin_attr ( struct dentry * dentry )
{
struct sysfs_dirent * sd = dentry - > d_fsdata ;
return ( ( struct bin_attribute * ) sd - > s_element ) ;
}
static inline struct kobject * sysfs_get_kobject ( struct dentry * dentry )
{
struct kobject * kobj = NULL ;
spin_lock ( & dcache_lock ) ;
if ( ! d_unhashed ( dentry ) ) {
struct sysfs_dirent * sd = dentry - > d_fsdata ;
if ( sd - > s_type & SYSFS_KOBJ_LINK ) {
struct sysfs_symlink * sl = sd - > s_element ;
kobj = kobject_get ( sl - > target_kobj ) ;
} else
kobj = kobject_get ( sd - > s_element ) ;
}
spin_unlock ( & dcache_lock ) ;
return kobj ;
}
static inline struct sysfs_dirent * sysfs_get ( struct sysfs_dirent * sd )
{
if ( sd ) {
WARN_ON ( ! atomic_read ( & sd - > s_count ) ) ;
atomic_inc ( & sd - > s_count ) ;
}
return sd ;
}
static inline void sysfs_put ( struct sysfs_dirent * sd )
{
2007-06-13 22:45:13 +04:00
if ( sd & & atomic_dec_and_test ( & sd - > s_count ) )
2005-04-17 02:20:36 +04:00
release_sysfs_dirent ( sd ) ;
}
2007-01-24 22:35:52 +03:00
static inline int sysfs_is_shadowed_inode ( struct inode * inode )
{
return S_ISDIR ( inode - > i_mode ) & & inode - > i_op - > follow_link ;
}