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/spinlock.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_CURRENT_OWNER 0x040 /* Set initial ownership to current */ 41#define DEVFS_FL_DEFAULT DEVFS_FL_NONE 42 43 44#define DEVFS_SPECIAL_CHR 0 45#define DEVFS_SPECIAL_BLK 1 46 47typedef struct devfs_entry * devfs_handle_t; 48 49#ifdef CONFIG_DEVFS_FS 50 51struct unique_numspace 52{ 53 spinlock_t init_lock; 54 unsigned char sem_initialised; 55 unsigned int num_free; /* Num free in bits */ 56 unsigned int length; /* Array length in bytes */ 57 unsigned long *bits; 58 struct semaphore semaphore; 59}; 60 61#define UNIQUE_NUMBERSPACE_INITIALISER {SPIN_LOCK_UNLOCKED, 0, 0, 0, NULL} 62 63extern void devfs_put (devfs_handle_t de); 64extern devfs_handle_t devfs_register (devfs_handle_t dir, const char *name, 65 unsigned int flags, 66 unsigned int major, unsigned int minor, 67 umode_t mode, void *ops, void *info); 68extern void devfs_unregister (devfs_handle_t de); 69extern int devfs_mk_symlink (devfs_handle_t dir, const char *name, 70 unsigned int flags, const char *link, 71 devfs_handle_t *handle, void *info); 72extern devfs_handle_t devfs_mk_dir (devfs_handle_t dir, const char *name, 73 void *info); 74extern devfs_handle_t devfs_get_handle (devfs_handle_t dir, const char *name, 75 unsigned int major,unsigned int minor, 76 char type, int traverse_symlinks); 77extern devfs_handle_t devfs_find_handle (devfs_handle_t dir, const char *name, 78 unsigned int major,unsigned int minor, 79 char type, int traverse_symlinks); 80extern int devfs_get_flags (devfs_handle_t de, unsigned int *flags); 81extern int devfs_set_flags (devfs_handle_t de, unsigned int flags); 82extern int devfs_get_maj_min (devfs_handle_t de, 83 unsigned int *major, unsigned int *minor); 84extern devfs_handle_t devfs_get_handle_from_inode (struct inode *inode); 85extern int devfs_generate_path (devfs_handle_t de, char *path, int buflen); 86extern void *devfs_get_ops (devfs_handle_t de); 87extern void devfs_put_ops (devfs_handle_t de); 88extern int devfs_set_file_size (devfs_handle_t de, unsigned long size); 89extern void *devfs_get_info (devfs_handle_t de); 90extern int devfs_set_info (devfs_handle_t de, void *info); 91extern devfs_handle_t devfs_get_parent (devfs_handle_t de); 92extern devfs_handle_t devfs_get_first_child (devfs_handle_t de); 93extern devfs_handle_t devfs_get_next_sibling (devfs_handle_t de); 94extern void devfs_auto_unregister (devfs_handle_t master,devfs_handle_t slave); 95extern devfs_handle_t devfs_get_unregister_slave (devfs_handle_t master); 96extern const char *devfs_get_name (devfs_handle_t de, unsigned int *namelen); 97extern int devfs_register_chrdev (unsigned int major, const char *name, 98 struct file_operations *fops); 99extern int devfs_register_blkdev (unsigned int major, const char *name, 100 struct block_device_operations *bdops); 101extern int devfs_unregister_chrdev (unsigned int major, const char *name); 102extern int devfs_unregister_blkdev (unsigned int major, const char *name); 103 104extern void devfs_register_tape (devfs_handle_t de); 105extern void devfs_register_series (devfs_handle_t dir, const char *format, 106 unsigned int num_entries, 107 unsigned int flags, unsigned int major, 108 unsigned int minor_start, 109 umode_t mode, void *ops, void *info); 110extern int devfs_alloc_major (char type); 111extern void devfs_dealloc_major (char type, int major); 112extern kdev_t devfs_alloc_devnum (char type); 113extern void devfs_dealloc_devnum (char type, kdev_t devnum); 114extern int devfs_alloc_unique_number (struct unique_numspace *space); 115extern void devfs_dealloc_unique_number (struct unique_numspace *space, 116 int number); 117 118extern void mount_devfs_fs (void); 119 120#else /* CONFIG_DEVFS_FS */ 121 122struct unique_numspace 123{ 124 char dummy; 125}; 126 127#define UNIQUE_NUMBERSPACE_INITIALISER {0} 128 129static inline void devfs_put (devfs_handle_t de) 130{ 131 return; 132} 133static inline devfs_handle_t devfs_register (devfs_handle_t dir, 134 const char *name, 135 unsigned int flags, 136 unsigned int major, 137 unsigned int minor, 138 umode_t mode, 139 void *ops, void *info) 140{ 141 return NULL; 142} 143static inline void devfs_unregister (devfs_handle_t de) 144{ 145 return; 146} 147static inline int devfs_mk_symlink (devfs_handle_t dir, const char *name, 148 unsigned int flags, const char *link, 149 devfs_handle_t *handle, void *info) 150{ 151 return 0; 152} 153static inline devfs_handle_t devfs_mk_dir (devfs_handle_t dir, 154 const char *name, void *info) 155{ 156 return NULL; 157} 158static inline devfs_handle_t devfs_get_handle (devfs_handle_t dir, 159 const char *name, 160 unsigned int major, 161 unsigned int minor, 162 char type, 163 int traverse_symlinks) 164{ 165 return NULL; 166} 167static inline devfs_handle_t devfs_find_handle (devfs_handle_t dir, 168 const char *name, 169 unsigned int major, 170 unsigned int minor, 171 char type, 172 int traverse_symlinks) 173{ 174 return NULL; 175} 176static inline int devfs_get_flags (devfs_handle_t de, unsigned int *flags) 177{ 178 return 0; 179} 180static inline int devfs_set_flags (devfs_handle_t de, unsigned int flags) 181{ 182 return 0; 183} 184static inline int devfs_get_maj_min (devfs_handle_t de, 185 unsigned int *major, unsigned int *minor) 186{ 187 return 0; 188} 189static inline devfs_handle_t devfs_get_handle_from_inode (struct inode *inode) 190{ 191 return NULL; 192} 193static inline int devfs_generate_path (devfs_handle_t de, char *path, 194 int buflen) 195{ 196 return -ENOSYS; 197} 198static inline void *devfs_get_ops (devfs_handle_t de) 199{ 200 return NULL; 201} 202static inline void devfs_put_ops (devfs_handle_t de) 203{ 204 return; 205} 206static inline int devfs_set_file_size (devfs_handle_t de, unsigned long size) 207{ 208 return -ENOSYS; 209} 210static inline void *devfs_get_info (devfs_handle_t de) 211{ 212 return NULL; 213} 214static inline int devfs_set_info (devfs_handle_t de, void *info) 215{ 216 return 0; 217} 218static inline devfs_handle_t devfs_get_parent (devfs_handle_t de) 219{ 220 return NULL; 221} 222static inline devfs_handle_t devfs_get_first_child (devfs_handle_t de) 223{ 224 return NULL; 225} 226static inline devfs_handle_t devfs_get_next_sibling (devfs_handle_t de) 227{ 228 return NULL; 229} 230static inline void devfs_auto_unregister (devfs_handle_t master, 231 devfs_handle_t slave) 232{ 233 return; 234} 235static inline devfs_handle_t devfs_get_unregister_slave (devfs_handle_t master) 236{ 237 return NULL; 238} 239static inline const char *devfs_get_name (devfs_handle_t de, 240 unsigned int *namelen) 241{ 242 return NULL; 243} 244static inline int devfs_register_chrdev (unsigned int major, const char *name, 245 struct file_operations *fops) 246{ 247 return register_chrdev (major, name, fops); 248} 249static inline int devfs_register_blkdev (unsigned int major, const char *name, 250 struct block_device_operations *bdops) 251{ 252 return register_blkdev (major, name, bdops); 253} 254static inline int devfs_unregister_chrdev (unsigned int major,const char *name) 255{ 256 return unregister_chrdev (major, name); 257} 258static inline int devfs_unregister_blkdev (unsigned int major,const char *name) 259{ 260 return unregister_blkdev (major, name); 261} 262 263static inline void devfs_register_tape (devfs_handle_t de) 264{ 265 return; 266} 267 268static inline void devfs_register_series (devfs_handle_t dir, 269 const char *format, 270 unsigned int num_entries, 271 unsigned int flags, 272 unsigned int major, 273 unsigned int minor_start, 274 umode_t mode, void *ops, void *info) 275{ 276 return; 277} 278 279static inline int devfs_alloc_major (char type) 280{ 281 return -1; 282} 283 284static inline void devfs_dealloc_major (char type, int major) 285{ 286 return; 287} 288 289static inline kdev_t devfs_alloc_devnum (char type) 290{ 291 return NODEV; 292} 293 294static inline void devfs_dealloc_devnum (char type, kdev_t devnum) 295{ 296 return; 297} 298 299static inline int devfs_alloc_unique_number (struct unique_numspace *space) 300{ 301 return -1; 302} 303 304static inline void devfs_dealloc_unique_number (struct unique_numspace *space, 305 int number) 306{ 307 return; 308} 309 310static inline void mount_devfs_fs (void) 311{ 312 return; 313} 314#endif /* CONFIG_DEVFS_FS */ 315 316#endif /* _LINUX_DEVFS_FS_KERNEL_H */ 317