sysfs: use generic_file_llseek() for sysfs_file_operations
[deliverable/linux.git] / fs / sysfs / sysfs.h
CommitLineData
6d66f5cd
TH
1/*
2 * fs/sysfs/sysfs.h - sysfs internal header file
3 *
4 * Copyright (c) 2001-3 Patrick Mochel
5 * Copyright (c) 2007 SUSE Linux Products GmbH
6 * Copyright (c) 2007 Tejun Heo <teheo@suse.de>
7 *
8 * This file is released under the GPLv2.
9 */
10
846f9974 11#include <linux/lockdep.h>
57cc7215 12#include <linux/kobject_ns.h>
ddd29ec6 13#include <linux/fs.h>
4f72c0ca 14#include <linux/rbtree.h>
ddd29ec6 15
85a4ffad
TH
16struct sysfs_open_dirent;
17
59f69015 18/* type-specific structures for sysfs_dirent->s_* union members */
3e519038 19struct sysfs_elem_dir {
59f69015 20 struct kobject *kobj;
7f9838fd 21
54d20f00 22 unsigned long subdirs;
4e4d6d86
EB
23 /* children rbtree starts here and goes through sd->s_rb */
24 struct rb_root children;
3e519038
TH
25};
26
27struct sysfs_elem_symlink {
59f69015 28 struct sysfs_dirent *target_sd;
3e519038
TH
29};
30
31struct sysfs_elem_attr {
56b3f3b8
TH
32 union {
33 struct attribute *attr;
34 struct bin_attribute *bin_attr;
35 };
85a4ffad 36 struct sysfs_open_dirent *open;
3e519038
TH
37};
38
ddd29ec6
DQ
39struct sysfs_inode_attrs {
40 struct iattr ia_iattr;
41 void *ia_secdata;
42 u32 ia_secdata_len;
43};
44
0ab66088 45/*
59f69015
TH
46 * sysfs_dirent - the building block of sysfs hierarchy. Each and
47 * every sysfs node is represented by single sysfs_dirent.
48 *
0ab66088
TH
49 * As long as s_count reference is held, the sysfs_dirent itself is
50 * accessible. Dereferencing s_elem or any other outer entity
51 * requires s_active reference.
52 */
d56c3eae
AR
53struct sysfs_dirent {
54 atomic_t s_count;
8619f979 55 atomic_t s_active;
846f9974
EB
56#ifdef CONFIG_DEBUG_LOCK_ALLOC
57 struct lockdep_map dep_map;
58#endif
59f69015 59 struct sysfs_dirent *s_parent;
59f69015 60 const char *s_name;
3e519038 61
4e4d6d86 62 struct rb_node s_rb;
4f72c0ca 63
58f2a4c7
MP
64 union {
65 struct completion *completion;
66 struct sysfs_dirent *removed_list;
67 } u;
68
be867b19 69 const void *s_ns; /* namespace tag */
4e4d6d86 70 unsigned int s_hash; /* ns + name hash */
3e519038 71 union {
b1fc3d61
TH
72 struct sysfs_elem_dir s_dir;
73 struct sysfs_elem_symlink s_symlink;
74 struct sysfs_elem_attr s_attr;
b1fc3d61 75 };
3e519038 76
15a33824 77 unsigned short s_flags;
2c3a908b 78 umode_t s_mode;
cafa6b5d 79 unsigned int s_ino;
ddd29ec6 80 struct sysfs_inode_attrs *s_iattr;
d56c3eae 81};
1da177e4 82
59f69015 83#define SD_DEACTIVATED_BIAS INT_MIN
0ab66088 84
59f69015 85#define SYSFS_TYPE_MASK 0x00ff
dc2f75f0
TH
86#define SYSFS_DIR 0x0001
87#define SYSFS_KOBJ_ATTR 0x0002
88#define SYSFS_KOBJ_BIN_ATTR 0x0004
89#define SYSFS_KOBJ_LINK 0x0008
59f69015 90#define SYSFS_COPY_NAME (SYSFS_DIR | SYSFS_KOBJ_LINK)
a2db6842 91#define SYSFS_ACTIVE_REF (SYSFS_KOBJ_ATTR | SYSFS_KOBJ_BIN_ATTR)
59f69015 92
cb26a311
TH
93#define SYSFS_FLAG_MASK ~SYSFS_TYPE_MASK
94#define SYSFS_FLAG_HAS_NS 0x01000
15a33824 95#define SYSFS_FLAG_REMOVED 0x02000
59f69015
TH
96
97static inline unsigned int sysfs_type(struct sysfs_dirent *sd)
98{
99 return sd->s_flags & SYSFS_TYPE_MASK;
100}
101
846f9974 102#ifdef CONFIG_DEBUG_LOCK_ALLOC
785a162d 103
846f9974
EB
104#define sysfs_dirent_init_lockdep(sd) \
105do { \
6992f533
EB
106 struct attribute *attr = sd->s_attr.attr; \
107 struct lock_class_key *key = attr->key; \
108 if (!key) \
109 key = &attr->skey; \
846f9974 110 \
6992f533 111 lockdep_init_map(&sd->dep_map, "s_active", key, 0); \
2c3a908b 112} while (0)
785a162d
TH
113
114/* Test for attributes that want to ignore lockdep for read-locking */
115static inline bool sysfs_ignore_lockdep(struct sysfs_dirent *sd)
116{
672f76a8
TH
117 int type = sysfs_type(sd);
118
119 return (type == SYSFS_KOBJ_ATTR || type == SYSFS_KOBJ_BIN_ATTR) &&
785a162d
TH
120 sd->s_attr.attr->ignore_lockdep;
121}
122
846f9974 123#else
785a162d 124
2c3a908b 125#define sysfs_dirent_init_lockdep(sd) do {} while (0)
785a162d
TH
126
127static inline bool sysfs_ignore_lockdep(struct sysfs_dirent *sd)
128{
129 return true;
130}
131
846f9974
EB
132#endif
133
59f69015
TH
134/*
135 * Context structure to be used while adding/removing nodes.
136 */
fb6896da 137struct sysfs_addrm_cxt {
fb6896da 138 struct sysfs_dirent *removed;
fb6896da
TH
139};
140
59f69015
TH
141/*
142 * mount.c
143 */
be867b19
SH
144
145/*
cb26a311
TH
146 * Each sb is associated with one namespace tag, currently the network
147 * namespace of the task which mounted this sysfs instance. If multiple
148 * tags become necessary, make the following an array and compare
149 * sysfs_dirent tag against every entry.
be867b19 150 */
9e7fdd25 151struct sysfs_super_info {
cb26a311 152 void *ns;
9e7fdd25
EB
153};
154#define sysfs_info(SB) ((struct sysfs_super_info *)(SB->s_fs_info))
51225039 155extern struct sysfs_dirent sysfs_root;
e18b890b 156extern struct kmem_cache *sysfs_dir_cachep;
1da177e4 157
59f69015
TH
158/*
159 * dir.c
160 */
3007e997 161extern struct mutex sysfs_mutex;
59f69015 162extern spinlock_t sysfs_assoc_lock;
469796d1 163extern const struct dentry_operations sysfs_dentry_ops;
59f69015 164
4b6f5d20 165extern const struct file_operations sysfs_dir_operations;
c5ef1c42 166extern const struct inode_operations sysfs_dir_inode_operations;
1da177e4 167
e72ceb8c
EB
168struct sysfs_dirent *sysfs_get_active(struct sysfs_dirent *sd);
169void sysfs_put_active(struct sysfs_dirent *sd);
d69ac5a0 170void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt);
d1c1459e 171void sysfs_warn_dup(struct sysfs_dirent *parent, const char *name);
d69ac5a0
TH
172int __sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd,
173 struct sysfs_dirent *parent_sd);
174int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd,
175 struct sysfs_dirent *parent_sd);
250f7c3f 176void sysfs_remove(struct sysfs_dirent *sd);
7eed6ecb
TH
177int sysfs_hash_and_remove(struct sysfs_dirent *dir_sd, const char *name,
178 const void *ns);
59f69015
TH
179void sysfs_addrm_finish(struct sysfs_addrm_cxt *acxt);
180
181struct sysfs_dirent *sysfs_find_dirent(struct sysfs_dirent *parent_sd,
cfec0bc8
TH
182 const unsigned char *name,
183 const void *ns);
59f69015
TH
184struct sysfs_dirent *sysfs_new_dirent(const char *name, umode_t mode, int type);
185
186void release_sysfs_dirent(struct sysfs_dirent *sd);
187
188int sysfs_create_subdir(struct kobject *kobj, const char *name,
189 struct sysfs_dirent **p_sd);
59f69015 190
2c3a908b 191int sysfs_rename(struct sysfs_dirent *sd, struct sysfs_dirent *new_parent_sd,
cfec0bc8 192 const char *new_name, const void *new_ns);
ca1bab38 193
f1282c84 194static inline struct sysfs_dirent *__sysfs_get(struct sysfs_dirent *sd)
1da177e4 195{
0ab66088
TH
196 if (sd) {
197 WARN_ON(!atomic_read(&sd->s_count));
198 atomic_inc(&sd->s_count);
199 }
200 return sd;
1da177e4 201}
f1282c84 202#define sysfs_get(sd) __sysfs_get(sd)
1da177e4 203
f1282c84 204static inline void __sysfs_put(struct sysfs_dirent *sd)
1da177e4 205{
0ab66088
TH
206 if (sd && atomic_dec_and_test(&sd->s_count))
207 release_sysfs_dirent(sd);
208}
f1282c84 209#define sysfs_put(sd) __sysfs_put(sd)
59f69015
TH
210
211/*
212 * inode.c
213 */
fac2622b 214struct inode *sysfs_get_inode(struct super_block *sb, struct sysfs_dirent *sd);
01cd9fef 215void sysfs_evict_inode(struct inode *inode);
35df63c4 216int sysfs_sd_setattr(struct sysfs_dirent *sd, struct iattr *iattr);
10556cb2 217int sysfs_permission(struct inode *inode, int mask);
59f69015 218int sysfs_setattr(struct dentry *dentry, struct iattr *iattr);
2c3a908b
GKH
219int sysfs_getattr(struct vfsmount *mnt, struct dentry *dentry,
220 struct kstat *stat);
ddd29ec6 221int sysfs_setxattr(struct dentry *dentry, const char *name, const void *value,
2c3a908b 222 size_t size, int flags);
e0bf68dd 223int sysfs_inode_init(void);
59f69015
TH
224
225/*
226 * file.c
227 */
228extern const struct file_operations sysfs_file_operations;
f9b9a621 229extern const struct file_operations sysfs_bin_operations;
59f69015
TH
230
231int sysfs_add_file(struct sysfs_dirent *dir_sd,
232 const struct attribute *attr, int type);
233
58292cbe
TH
234int sysfs_add_file_mode_ns(struct sysfs_dirent *dir_sd,
235 const struct attribute *attr, int type,
236 umode_t amode, const void *ns);
73d97146
TH
237void sysfs_unmap_bin_file(struct sysfs_dirent *sd);
238
59f69015
TH
239/*
240 * symlink.c
241 */
242extern const struct inode_operations sysfs_symlink_inode_operations;
0bb8f3d6
RW
243int sysfs_create_link_sd(struct sysfs_dirent *sd, struct kobject *target,
244 const char *name);
This page took 0.664797 seconds and 5 git commands to generate.