sysfs.h 4.6 KB
Newer Older
T
Tejun Heo 已提交
1 2 3 4 5 6 7 8 9 10
/*
 * fs/sysfs/sysfs.h - sysfs internal header file
 *
 * Copyright (c) 2001-3 Patrick Mochel
 * Copyright (c) 2007 SUSE Linux Products GmbH
 * Copyright (c) 2007 Tejun Heo <teheo@suse.de>
 *
 * This file is released under the GPLv2.
 */

11
#include <linux/lockdep.h>
A
Alexey Dobriyan 已提交
12
#include <linux/kobject_ns.h>
13
#include <linux/fs.h>
14
#include <linux/rbtree.h>
15

T
Tejun Heo 已提交
16 17
struct sysfs_open_dirent;

T
Tejun Heo 已提交
18
/* type-specific structures for sysfs_dirent->s_* union members */
19
struct sysfs_elem_dir {
20
	unsigned long		subdirs;
21 22
	/* children rbtree starts here and goes through sd->s_rb */
	struct rb_root		children;
23 24 25
};

struct sysfs_elem_symlink {
T
Tejun Heo 已提交
26
	struct sysfs_dirent	*target_sd;
27 28 29
};

struct sysfs_elem_attr {
T
Tejun Heo 已提交
30
	const struct kernfs_ops	*ops;
T
Tejun Heo 已提交
31
	struct sysfs_open_dirent *open;
32
	loff_t			size;
33 34
};

35 36 37 38 39 40
struct sysfs_inode_attrs {
	struct iattr	ia_iattr;
	void		*ia_secdata;
	u32		ia_secdata_len;
};

41
/*
T
Tejun Heo 已提交
42 43 44
 * sysfs_dirent - the building block of sysfs hierarchy.  Each and
 * every sysfs node is represented by single sysfs_dirent.
 *
45 46 47 48
 * As long as s_count reference is held, the sysfs_dirent itself is
 * accessible.  Dereferencing s_elem or any other outer entity
 * requires s_active reference.
 */
49 50
struct sysfs_dirent {
	atomic_t		s_count;
51
	atomic_t		s_active;
52 53 54
#ifdef CONFIG_DEBUG_LOCK_ALLOC
	struct lockdep_map	dep_map;
#endif
T
Tejun Heo 已提交
55 56
	struct sysfs_dirent	*s_parent;
	const char		*s_name;
57

58
	struct rb_node		s_rb;
59

M
Mikulas Patocka 已提交
60 61 62 63 64
	union {
		struct completion	*completion;
		struct sysfs_dirent	*removed_list;
	} u;

65
	const void		*s_ns; /* namespace tag */
66
	unsigned int		s_hash; /* ns + name hash */
67
	union {
T
Tejun Heo 已提交
68 69 70 71
		struct sysfs_elem_dir		s_dir;
		struct sysfs_elem_symlink	s_symlink;
		struct sysfs_elem_attr		s_attr;
	};
72

73 74
	void			*priv;

75
	unsigned short		s_flags;
76
	umode_t			s_mode;
77
	unsigned int		s_ino;
78
	struct sysfs_inode_attrs *s_iattr;
79
};
L
Linus Torvalds 已提交
80

T
Tejun Heo 已提交
81
#define SD_DEACTIVATED_BIAS		INT_MIN
82

83
#define SYSFS_TYPE_MASK			0x000f
84 85
#define SYSFS_DIR			0x0001
#define SYSFS_KOBJ_ATTR			0x0002
86
#define SYSFS_KOBJ_LINK			0x0004
T
Tejun Heo 已提交
87
#define SYSFS_COPY_NAME			(SYSFS_DIR | SYSFS_KOBJ_LINK)
88
#define SYSFS_ACTIVE_REF		SYSFS_KOBJ_ATTR
T
Tejun Heo 已提交
89

90
#define SYSFS_FLAG_MASK			~SYSFS_TYPE_MASK
91 92 93 94
#define SYSFS_FLAG_REMOVED		0x0010
#define SYSFS_FLAG_NS			0x0020
#define SYSFS_FLAG_HAS_SEQ_SHOW		0x0040
#define SYSFS_FLAG_HAS_MMAP		0x0080
95
#define SYSFS_FLAG_LOCKDEP		0x0100
T
Tejun Heo 已提交
96 97 98 99 100 101 102 103 104

static inline unsigned int sysfs_type(struct sysfs_dirent *sd)
{
	return sd->s_flags & SYSFS_TYPE_MASK;
}

/*
 * Context structure to be used while adding/removing nodes.
 */
105 106 107 108
struct sysfs_addrm_cxt {
	struct sysfs_dirent	*removed;
};

T
Tejun Heo 已提交
109 110 111
/*
 * mount.c
 */
112 113

/*
114 115 116 117
 * Each sb is associated with one namespace tag, currently the network
 * namespace of the task which mounted this sysfs instance.  If multiple
 * tags become necessary, make the following an array and compare
 * sysfs_dirent tag against every entry.
118
 */
119
struct sysfs_super_info {
120
	void *ns;
121 122
};
#define sysfs_info(SB) ((struct sysfs_super_info *)(SB->s_fs_info))
123
extern struct sysfs_dirent sysfs_root;
124
extern struct kmem_cache *sysfs_dir_cachep;
L
Linus Torvalds 已提交
125

T
Tejun Heo 已提交
126 127 128
/*
 * dir.c
 */
129
extern struct mutex sysfs_mutex;
130
extern spinlock_t sysfs_symlink_target_lock;
131
extern const struct dentry_operations sysfs_dentry_ops;
T
Tejun Heo 已提交
132

133
extern const struct file_operations sysfs_dir_operations;
134
extern const struct inode_operations sysfs_dir_inode_operations;
L
Linus Torvalds 已提交
135

136 137
struct sysfs_dirent *sysfs_get_active(struct sysfs_dirent *sd);
void sysfs_put_active(struct sysfs_dirent *sd);
138
void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt);
139
void sysfs_warn_dup(struct sysfs_dirent *parent, const char *name);
140 141
int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd,
		  struct sysfs_dirent *parent_sd);
T
Tejun Heo 已提交
142 143 144 145 146 147 148
void sysfs_addrm_finish(struct sysfs_addrm_cxt *acxt);

struct sysfs_dirent *sysfs_new_dirent(const char *name, umode_t mode, int type);

/*
 * inode.c
 */
149
struct inode *sysfs_get_inode(struct super_block *sb, struct sysfs_dirent *sd);
A
Al Viro 已提交
150
void sysfs_evict_inode(struct inode *inode);
151
int sysfs_permission(struct inode *inode, int mask);
T
Tejun Heo 已提交
152
int sysfs_setattr(struct dentry *dentry, struct iattr *iattr);
153 154
int sysfs_getattr(struct vfsmount *mnt, struct dentry *dentry,
		  struct kstat *stat);
155
int sysfs_setxattr(struct dentry *dentry, const char *name, const void *value,
156
		   size_t size, int flags);
P
Peter Zijlstra 已提交
157
int sysfs_inode_init(void);
T
Tejun Heo 已提交
158 159 160 161

/*
 * file.c
 */
162
extern const struct file_operations kernfs_file_operations;
T
Tejun Heo 已提交
163 164

int sysfs_add_file(struct sysfs_dirent *dir_sd,
165
		   const struct attribute *attr, bool is_bin);
T
Tejun Heo 已提交
166

167
int sysfs_add_file_mode_ns(struct sysfs_dirent *dir_sd,
168
			   const struct attribute *attr, bool is_bin,
169
			   umode_t amode, const void *ns);
170 171
void sysfs_unmap_bin_file(struct sysfs_dirent *sd);

T
Tejun Heo 已提交
172 173 174 175
/*
 * symlink.c
 */
extern const struct inode_operations sysfs_symlink_inode_operations;
176 177
int sysfs_create_link_sd(struct sysfs_dirent *sd, struct kobject *target,
			 const char *name);