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