sysfs.h 3.5 KB
Newer Older
1 2
struct sysfs_dirent {
	atomic_t		s_count;
T
Tejun Heo 已提交
3
	struct sysfs_dirent	* s_parent;
4 5
	struct list_head	s_sibling;
	struct list_head	s_children;
T
Tejun Heo 已提交
6
	const char		* s_name;
7 8 9
	void 			* s_element;
	int			s_type;
	umode_t			s_mode;
10
	ino_t			s_ino;
11 12 13 14
	struct dentry		* s_dentry;
	struct iattr		* s_iattr;
	atomic_t		s_event;
};
L
Linus Torvalds 已提交
15 16

extern struct vfsmount * sysfs_mount;
17
extern struct kmem_cache *sysfs_dir_cachep;
L
Linus Torvalds 已提交
18

19
extern void sysfs_delete_inode(struct inode *inode);
20
extern struct inode * sysfs_new_inode(mode_t mode, struct sysfs_dirent *);
L
Linus Torvalds 已提交
21 22
extern int sysfs_create(struct dentry *, int mode, int (*init)(struct inode *));

23
extern void release_sysfs_dirent(struct sysfs_dirent * sd);
24
extern int sysfs_dirent_exist(struct sysfs_dirent *, const unsigned char *);
T
Tejun Heo 已提交
25 26
extern struct sysfs_dirent *sysfs_new_dirent(const char *name, void *element,
					     umode_t mode, int type);
27 28 29
extern void sysfs_attach_dirent(struct sysfs_dirent *sd,
				struct sysfs_dirent *parent_sd,
				struct dentry *dentry);
L
Linus Torvalds 已提交
30 31

extern int sysfs_add_file(struct dentry *, const struct attribute *, int);
32
extern int sysfs_hash_and_remove(struct dentry * dir, const char * name);
33
extern struct sysfs_dirent *sysfs_find(struct sysfs_dirent *dir, const char * name);
L
Linus Torvalds 已提交
34 35 36 37 38

extern int sysfs_create_subdir(struct kobject *, const char *, struct dentry **);
extern void sysfs_remove_subdir(struct dentry *);

extern void sysfs_drop_dentry(struct sysfs_dirent *sd, struct dentry *parent);
39
extern int sysfs_setattr(struct dentry *dentry, struct iattr *iattr);
L
Linus Torvalds 已提交
40

41
extern spinlock_t sysfs_lock;
L
Linus Torvalds 已提交
42 43
extern struct rw_semaphore sysfs_rename_sem;
extern struct super_block * sysfs_sb;
44 45 46
extern const struct file_operations sysfs_dir_operations;
extern const struct file_operations sysfs_file_operations;
extern const struct file_operations bin_fops;
47 48
extern const struct inode_operations sysfs_dir_inode_operations;
extern const struct inode_operations sysfs_symlink_inode_operations;
L
Linus Torvalds 已提交
49 50 51 52 53

struct sysfs_symlink {
	struct kobject * target_kobj;
};

54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
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;
};

L
Linus Torvalds 已提交
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
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)
{
117
	if (sd && atomic_dec_and_test(&sd->s_count))
L
Linus Torvalds 已提交
118 119 120
		release_sysfs_dirent(sd);
}

121 122 123 124
static inline int sysfs_is_shadowed_inode(struct inode *inode)
{
	return S_ISDIR(inode->i_mode) && inode->i_op->follow_link;
}