File: /usr/src/linux/include/linux/devfs_fs_kernel.h
1 #ifndef _LINUX_DEVFS_FS_KERNEL_H
2 #define _LINUX_DEVFS_FS_KERNEL_H
3
4 #include <linux/fs.h>
5 #include <linux/config.h>
6 #include <linux/locks.h>
7 #include <linux/kdev_t.h>
8 #include <linux/types.h>
9
10 #include <asm/semaphore.h>
11
12 #define DEVFS_SUPER_MAGIC 0x1373
13
14 #define IS_DEVFS_INODE(inode) (DEVFS_SUPER_MAGIC == (inode)->i_sb->s_magic)
15
16 #define DEVFS_MINOR(inode) \
17 ({unsigned int m; /* evil GCC trickery */ \
18 ((inode)->i_sb && \
19 ((inode)->i_sb->s_magic==DEVFS_SUPER_MAGIC) && \
20 (devfs_get_maj_min(devfs_get_handle_from_inode((inode)),NULL,&m)==0) \
21 ) ? m : MINOR((inode)->r_dev); })
22
23
24 #define DEVFS_FL_NONE 0x000 /* This helps to make code more readable
25 */
26 #define DEVFS_FL_AUTO_OWNER 0x001 /* When a closed inode is opened the
27 ownerships are set to the opening
28 process and the protection is set to
29 that given in <<mode>>. When the inode
30 is closed, ownership reverts back to
31 <<uid>> and <<gid>> and the protection
32 is set to read-write for all */
33 #define DEVFS_FL_HIDE 0x002 /* Do not show entry in directory list */
34 #define DEVFS_FL_AUTO_DEVNUM 0x004 /* Automatically generate device number
35 */
36 #define DEVFS_FL_AOPEN_NOTIFY 0x008 /* Asynchronously notify devfsd on open
37 */
38 #define DEVFS_FL_REMOVABLE 0x010 /* This is a removable media device */
39 #define DEVFS_FL_WAIT 0x020 /* Wait for devfsd to finish */
40 #define DEVFS_FL_NO_PERSISTENCE 0x040 /* Forget changes after unregister */
41 #define DEVFS_FL_CURRENT_OWNER 0x080 /* Set initial ownership to current */
42 #define DEVFS_FL_DEFAULT DEVFS_FL_NONE
43
44
45 #define DEVFS_SPECIAL_CHR 0
46 #define DEVFS_SPECIAL_BLK 1
47
48 typedef struct devfs_entry * devfs_handle_t;
49
50
51 #ifdef CONFIG_BLK_DEV_INITRD
52 # define ROOT_DEVICE_NAME ((real_root_dev ==ROOT_DEV) ? root_device_name:NULL)
53 #else
54 # define ROOT_DEVICE_NAME root_device_name
55 #endif
56
57
58 #ifdef CONFIG_DEVFS_FS
59
60 struct unique_numspace
61 {
62 spinlock_t init_lock;
63 unsigned char sem_initialised;
64 unsigned int num_free; /* Num free in bits */
65 unsigned int length; /* Array length in bytes */
66 __u32 *bits;
67 struct semaphore semaphore;
68 };
69
70 #define UNIQUE_NUMBERSPACE_INITIALISER {SPIN_LOCK_UNLOCKED, 0, 0, 0, NULL}
71
72 extern devfs_handle_t devfs_register (devfs_handle_t dir, const char *name,
73 unsigned int flags,
74 unsigned int major, unsigned int minor,
75 umode_t mode, void *ops, void *info);
76 extern void devfs_unregister (devfs_handle_t de);
77 extern int devfs_mk_symlink (devfs_handle_t dir, const char *name,
78 unsigned int flags, const char *link,
79 devfs_handle_t *handle, void *info);
80 extern devfs_handle_t devfs_mk_dir (devfs_handle_t dir, const char *name,
81 void *info);
82 extern devfs_handle_t devfs_find_handle (devfs_handle_t dir, const char *name,
83 unsigned int major,unsigned int minor,
84 char type, int traverse_symlinks);
85 extern int devfs_get_flags (devfs_handle_t de, unsigned int *flags);
86 extern int devfs_set_flags (devfs_handle_t de, unsigned int flags);
87 extern int devfs_get_maj_min (devfs_handle_t de,
88 unsigned int *major, unsigned int *minor);
89 extern devfs_handle_t devfs_get_handle_from_inode (struct inode *inode);
90 extern int devfs_generate_path (devfs_handle_t de, char *path, int buflen);
91 extern void *devfs_get_ops (devfs_handle_t de);
92 extern int devfs_set_file_size (devfs_handle_t de, unsigned long size);
93 extern void *devfs_get_info (devfs_handle_t de);
94 extern int devfs_set_info (devfs_handle_t de, void *info);
95 extern devfs_handle_t devfs_get_parent (devfs_handle_t de);
96 extern devfs_handle_t devfs_get_first_child (devfs_handle_t de);
97 extern devfs_handle_t devfs_get_next_sibling (devfs_handle_t de);
98 extern void devfs_auto_unregister (devfs_handle_t master,devfs_handle_t slave);
99 extern devfs_handle_t devfs_get_unregister_slave (devfs_handle_t master);
100 extern const char *devfs_get_name (devfs_handle_t de, unsigned int *namelen);
101 extern int devfs_register_chrdev (unsigned int major, const char *name,
102 struct file_operations *fops);
103 extern int devfs_register_blkdev (unsigned int major, const char *name,
104 struct block_device_operations *bdops);
105 extern int devfs_unregister_chrdev (unsigned int major, const char *name);
106 extern int devfs_unregister_blkdev (unsigned int major, const char *name);
107
108 extern void devfs_register_tape (devfs_handle_t de);
109 extern void devfs_register_series (devfs_handle_t dir, const char *format,
110 unsigned int num_entries,
111 unsigned int flags, unsigned int major,
112 unsigned int minor_start,
113 umode_t mode, void *ops, void *info);
114 extern int devfs_alloc_major (char type);
115 extern void devfs_dealloc_major (char type, int major);
116 extern kdev_t devfs_alloc_devnum (char type);
117 extern void devfs_dealloc_devnum (char type, kdev_t devnum);
118 extern int devfs_alloc_unique_number (struct unique_numspace *space);
119 extern void devfs_dealloc_unique_number (struct unique_numspace *space,
120 int number);
121
122 extern void mount_devfs_fs (void);
123 extern void devfs_make_root (const char *name);
124
125 #else /* CONFIG_DEVFS_FS */
126
127 struct unique_numspace
128 {
129 char dummy;
130 };
131
132 #define UNIQUE_NUMBERSPACE_INITIALISER {0}
133
134 static inline devfs_handle_t devfs_register (devfs_handle_t dir,
135 const char *name,
136 unsigned int flags,
137 unsigned int major,
138 unsigned int minor,
139 umode_t mode,
140 void *ops, void *info)
141 {
142 return NULL;
143 }
144 static inline void devfs_unregister (devfs_handle_t de)
145 {
146 return;
147 }
148 static inline int devfs_mk_symlink (devfs_handle_t dir, const char *name,
149 unsigned int flags, const char *link,
150 devfs_handle_t *handle, void *info)
151 {
152 return 0;
153 }
154 static inline devfs_handle_t devfs_mk_dir (devfs_handle_t dir,
155 const char *name, void *info)
156 {
157 return NULL;
158 }
159 static inline devfs_handle_t devfs_find_handle (devfs_handle_t dir,
160 const char *name,
161 unsigned int major,
162 unsigned int minor,
163 char type,
164 int traverse_symlinks)
165 {
166 return NULL;
167 }
168 static inline int devfs_get_flags (devfs_handle_t de, unsigned int *flags)
169 {
170 return 0;
171 }
172 static inline int devfs_set_flags (devfs_handle_t de, unsigned int flags)
173 {
174 return 0;
175 }
176 static inline int devfs_get_maj_min (devfs_handle_t de,
177 unsigned int *major, unsigned int *minor)
178 {
179 return 0;
180 }
181 static inline devfs_handle_t devfs_get_handle_from_inode (struct inode *inode)
182 {
183 return NULL;
184 }
185 static inline int devfs_generate_path (devfs_handle_t de, char *path,
186 int buflen)
187 {
188 return -ENOSYS;
189 }
190 static inline void *devfs_get_ops (devfs_handle_t de)
191 {
192 return NULL;
193 }
194 static inline int devfs_set_file_size (devfs_handle_t de, unsigned long size)
195 {
196 return -ENOSYS;
197 }
198 static inline void *devfs_get_info (devfs_handle_t de)
199 {
200 return NULL;
201 }
202 static inline int devfs_set_info (devfs_handle_t de, void *info)
203 {
204 return 0;
205 }
206 static inline devfs_handle_t devfs_get_parent (devfs_handle_t de)
207 {
208 return NULL;
209 }
210 static inline devfs_handle_t devfs_get_first_child (devfs_handle_t de)
211 {
212 return NULL;
213 }
214 static inline devfs_handle_t devfs_get_next_sibling (devfs_handle_t de)
215 {
216 return NULL;
217 }
218 static inline void devfs_auto_unregister (devfs_handle_t master,
219 devfs_handle_t slave)
220 {
221 return;
222 }
223 static inline devfs_handle_t devfs_get_unregister_slave (devfs_handle_t master)
224 {
225 return NULL;
226 }
227 static inline const char *devfs_get_name (devfs_handle_t de,
228 unsigned int *namelen)
229 {
230 return NULL;
231 }
232 static inline int devfs_register_chrdev (unsigned int major, const char *name,
233 struct file_operations *fops)
234 {
235 return register_chrdev (major, name, fops);
236 }
237 static inline int devfs_register_blkdev (unsigned int major, const char *name,
238 struct block_device_operations *bdops)
239 {
240 return register_blkdev (major, name, bdops);
241 }
242 static inline int devfs_unregister_chrdev (unsigned int major,const char *name)
243 {
244 return unregister_chrdev (major, name);
245 }
246 static inline int devfs_unregister_blkdev (unsigned int major,const char *name)
247 {
248 return unregister_blkdev (major, name);
249 }
250
251 static inline void devfs_register_tape (devfs_handle_t de)
252 {
253 return;
254 }
255
256 static inline void devfs_register_series (devfs_handle_t dir,
257 const char *format,
258 unsigned int num_entries,
259 unsigned int flags,
260 unsigned int major,
261 unsigned int minor_start,
262 umode_t mode, void *ops, void *info)
263 {
264 return;
265 }
266
267 static inline int devfs_alloc_major (char type)
268 {
269 return -1;
270 }
271
272 static inline void devfs_dealloc_major (char type, int major)
273 {
274 return;
275 }
276
277 static inline kdev_t devfs_alloc_devnum (char type)
278 {
279 return NODEV;
280 }
281
282 static inline void devfs_dealloc_devnum (char type, kdev_t devnum)
283 {
284 return;
285 }
286
287 static inline int devfs_alloc_unique_number (struct unique_numspace *space)
288 {
289 return -1;
290 }
291
292 static inline void devfs_dealloc_unique_number (struct unique_numspace *space,
293 int number)
294 {
295 return;
296 }
297
298 static inline void mount_devfs_fs (void)
299 {
300 return;
301 }
302 static inline void devfs_make_root (const char *name)
303 {
304 return;
305 }
306 #endif /* CONFIG_DEVFS_FS */
307
308 #endif /* _LINUX_DEVFS_FS_KERNEL_H */
309