1 /*****************************************************************************/
4 * inode.c -- Inode/Dentry functions for the USB device file system.
7 * Thomas Sailer (sailer@ife.ee.ethz.ch)
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 * $Id: inode.c,v 1.1.1.1 2005/04/11 02:50:40 jack Exp $
26 * 0.1 04.01.2000 Created
29 /*****************************************************************************/
31 #define __NO_VERSION__
32 #include <linux/config.h>
33 #include <linux/module.h>
35 #include <linux/sched.h>
36 #include <linux/smp_lock.h>
37 #include <linux/locks.h>
38 #include <linux/init.h>
39 #include <linux/proc_fs.h>
40 #include <linux/usb.h>
41 #include <linux/usbdevice_fs.h>
42 #include <asm/uaccess.h>
44 /* --------------------------------------------------------------------- */
47 * This list of superblocks is still used,
48 * but since usbdevfs became FS_SINGLE
49 * there is only one super_block.
51 static LIST_HEAD(superlist);
55 struct file_operations *fops;
57 struct list_head inodes;
60 static struct special special[] = {
61 { "devices", &usbdevfs_devices_fops, },
62 { "drivers", &usbdevfs_drivers_fops, }
65 #define NRSPECIAL (sizeof(special)/sizeof(special[0]))
67 /* --------------------------------------------------------------------- */
69 static int dnumber(struct dentry *dentry)
74 if (dentry->d_name.len != 3)
76 name = dentry->d_name.name;
77 if (name[0] < '0' || name[0] > '9' ||
78 name[1] < '0' || name[1] > '9' ||
79 name[2] < '0' || name[2] > '9')
82 s = s * 10 + name[1] - '0';
83 s = s * 10 + name[2] - '0';
88 * utility functions; should be called with the kernel lock held
89 * to protect against busses/devices appearing/disappearing
92 static void new_dev_inode(struct usb_device *dev, struct super_block *sb)
95 unsigned int devnum = dev->devnum;
96 unsigned int busnum = dev->bus->busnum;
98 if (devnum < 1 || devnum > 127 || busnum > 255)
100 inode = iget(sb, IDEVICE | (busnum << 8) | devnum);
102 printk(KERN_ERR "usbdevfs: cannot create inode for bus %u device %u\n", busnum, devnum);
105 inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
106 inode->i_uid = sb->u.usbdevfs_sb.devuid;
107 inode->i_gid = sb->u.usbdevfs_sb.devgid;
108 inode->i_mode = sb->u.usbdevfs_sb.devmode | S_IFREG;
109 inode->i_fop = &usbdevfs_device_file_operations;
110 inode->i_size = sizeof(struct usb_device_descriptor);
111 inode->u.usbdev_i.p.dev = dev;
112 list_add_tail(&inode->u.usbdev_i.slist, &sb->u.usbdevfs_sb.ilist);
113 list_add_tail(&inode->u.usbdev_i.dlist, &dev->inodes);
116 static void recurse_new_dev_inode(struct usb_device *dev, struct super_block *sb)
122 new_dev_inode(dev, sb);
123 for (i = 0; i < dev->maxchild; i++) {
124 if (!dev->children[i])
126 recurse_new_dev_inode(dev->children[i], sb);
130 static void new_bus_inode(struct usb_bus *bus, struct super_block *sb)
133 unsigned int busnum = bus->busnum;
137 inode = iget(sb, IBUS | (busnum << 8));
139 printk(KERN_ERR "usbdevfs: cannot create inode for bus %u\n", busnum);
142 inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
143 inode->i_uid = sb->u.usbdevfs_sb.busuid;
144 inode->i_gid = sb->u.usbdevfs_sb.busgid;
145 inode->i_mode = sb->u.usbdevfs_sb.busmode | S_IFDIR;
146 inode->i_op = &usbdevfs_bus_inode_operations;
147 inode->i_fop = &usbdevfs_bus_file_operations;
148 inode->u.usbdev_i.p.bus = bus;
149 list_add_tail(&inode->u.usbdev_i.slist, &sb->u.usbdevfs_sb.ilist);
150 list_add_tail(&inode->u.usbdev_i.dlist, &bus->inodes);
153 static void free_inode(struct inode *inode)
155 inode->u.usbdev_i.p.bus = NULL;
156 inode->u.usbdev_i.p.dev = NULL;
157 inode->i_mode &= ~S_IRWXUGO;
158 inode->i_uid = inode->i_gid = 0;
160 list_del(&inode->u.usbdev_i.slist);
161 list_del(&inode->u.usbdev_i.dlist);
165 static int parse_options(struct super_block *s, char *data)
167 uid_t devuid = 0, busuid = 0, listuid = 0;
168 gid_t devgid = 0, busgid = 0, listgid = 0;
169 umode_t devmode = S_IWUSR | S_IRUGO, busmode = S_IXUGO | S_IRUGO, listmode = S_IRUGO;
170 char *curopt = NULL, *value;
174 curopt = strtok(data, ",");
175 for (; curopt; curopt = strtok(NULL, ",")) {
176 if ((value = strchr(curopt, '=')) != NULL)
178 if (!strcmp(curopt, "devuid")) {
179 if (!value || !value[0])
181 devuid = simple_strtoul(value, &value, 0);
185 if (!strcmp(curopt, "devgid")) {
186 if (!value || !value[0])
188 devgid = simple_strtoul(value, &value, 0);
192 if (!strcmp(curopt, "devmode")) {
193 if (!value || !value[0])
195 devmode = simple_strtoul(value, &value, 0) & S_IRWXUGO;
199 if (!strcmp(curopt, "busuid")) {
200 if (!value || !value[0])
202 busuid = simple_strtoul(value, &value, 0);
206 if (!strcmp(curopt, "busgid")) {
207 if (!value || !value[0])
209 busgid = simple_strtoul(value, &value, 0);
213 if (!strcmp(curopt, "busmode")) {
214 if (!value || !value[0])
216 busmode = simple_strtoul(value, &value, 0) & S_IRWXUGO;
220 if (!strcmp(curopt, "listuid")) {
221 if (!value || !value[0])
223 listuid = simple_strtoul(value, &value, 0);
227 if (!strcmp(curopt, "listgid")) {
228 if (!value || !value[0])
230 listgid = simple_strtoul(value, &value, 0);
234 if (!strcmp(curopt, "listmode")) {
235 if (!value || !value[0])
237 listmode = simple_strtoul(value, &value, 0) & S_IRWXUGO;
243 s->u.usbdevfs_sb.devuid = devuid;
244 s->u.usbdevfs_sb.devgid = devgid;
245 s->u.usbdevfs_sb.devmode = devmode;
246 s->u.usbdevfs_sb.busuid = busuid;
247 s->u.usbdevfs_sb.busgid = busgid;
248 s->u.usbdevfs_sb.busmode = busmode;
249 s->u.usbdevfs_sb.listuid = listuid;
250 s->u.usbdevfs_sb.listgid = listgid;
251 s->u.usbdevfs_sb.listmode = listmode;
256 static struct usb_bus *usbdevfs_findbus(int busnr)
258 struct list_head *list;
261 down (&usb_bus_list_lock);
262 for (list = usb_bus_list.next; list != &usb_bus_list; list = list->next) {
263 bus = list_entry(list, struct usb_bus, bus_list);
264 if (bus->busnum == busnr) {
265 up (&usb_bus_list_lock);
269 up (&usb_bus_list_lock);
274 static struct usb_device *finddev(struct usb_device *dev, int devnr)
277 struct usb_device *d2;
281 if (dev->devnum == devnr)
283 for (i = 0; i < dev->maxchild; i++) {
284 if (!dev->children[i])
286 if ((d2 = finddev(dev->children[i], devnr)))
292 static struct usb_device *usbdevfs_finddevice(struct usb_bus *bus, int devnr)
294 return finddev(bus->root_hub, devnr);
298 /* --------------------------------------------------------------------- */
300 static int usbdevfs_revalidate(struct dentry *dentry, int flags)
302 struct inode *inode = dentry->d_inode;
306 if (ITYPE(inode->i_ino) == IBUS && !inode->u.usbdev_i.p.bus)
308 if (ITYPE(inode->i_ino) == IDEVICE && !inode->u.usbdev_i.p.dev)
313 static struct dentry_operations usbdevfs_dentry_operations = {
314 d_revalidate: usbdevfs_revalidate,
317 static struct dentry *usbdevfs_root_lookup(struct inode *dir, struct dentry *dentry)
320 unsigned long ino = 0;
325 if (dir->i_ino != IROOT)
326 return ERR_PTR(-EINVAL);
327 dentry->d_op = &usbdevfs_dentry_operations;
328 busnr = dnumber(dentry);
329 if (busnr >= 0 && busnr <= 255)
330 ino = IBUS | (busnr << 8);
332 for (i = 0; i < NRSPECIAL; i++) {
333 if (strlen(special[i].name) == dentry->d_name.len &&
334 !strncmp(special[i].name, dentry->d_name.name, dentry->d_name.len)) {
335 ino = ISPECIAL | (i + IROOT + 1);
341 return ERR_PTR(-ENOENT);
342 inode = iget(dir->i_sb, ino);
344 return ERR_PTR(-EINVAL);
345 if (inode && ITYPE(ino) == IBUS && inode->u.usbdev_i.p.bus == NULL) {
349 d_add(dentry, inode);
353 static struct dentry *usbdevfs_bus_lookup(struct inode *dir, struct dentry *dentry)
359 if (ITYPE(dir->i_ino) != IBUS)
360 return ERR_PTR(-EINVAL);
361 dentry->d_op = &usbdevfs_dentry_operations;
362 devnr = dnumber(dentry);
363 if (devnr < 1 || devnr > 127)
364 return ERR_PTR(-ENOENT);
365 inode = iget(dir->i_sb, IDEVICE | (dir->i_ino & (0xff << 8)) | devnr);
367 return ERR_PTR(-EINVAL);
368 if (inode && inode->u.usbdev_i.p.dev == NULL) {
372 d_add(dentry, inode);
376 static int usbdevfs_root_readdir(struct file *filp, void *dirent, filldir_t filldir)
378 struct inode *inode = filp->f_dentry->d_inode;
379 unsigned long ino = inode->i_ino;
380 struct special *spec;
381 struct list_head *list;
392 if (filldir(dirent, ".", 1, i, IROOT, DT_DIR) < 0)
399 if (filldir(dirent, "..", 2, i, IROOT, DT_DIR) < 0)
407 while (i >= 2 && i < 2+NRSPECIAL) {
408 spec = &special[filp->f_pos-2];
409 if (filldir(dirent, spec->name, strlen(spec->name), i, ISPECIAL | (filp->f_pos-2+IROOT), DT_UNKNOWN) < 0)
417 down (&usb_bus_list_lock);
418 for (list = usb_bus_list.next; list != &usb_bus_list; list = list->next) {
423 bus = list_entry(list, struct usb_bus, bus_list);
424 sprintf(numbuf, "%03d", bus->busnum);
425 if (filldir(dirent, numbuf, 3, filp->f_pos, IBUS | ((bus->busnum & 0xff) << 8), DT_UNKNOWN) < 0)
429 up (&usb_bus_list_lock);
434 static int bus_readdir(struct usb_device *dev, unsigned long ino, int pos, struct file *filp, void *dirent, filldir_t filldir)
441 sprintf(numbuf, "%03d", dev->devnum);
445 if (filldir(dirent, numbuf, 3, filp->f_pos, ino | (dev->devnum & 0xff), DT_UNKNOWN) < 0)
449 for (i = 0; i < dev->maxchild; i++) {
450 if (!dev->children[i])
452 pos = bus_readdir(dev->children[i], ino, pos, filp, dirent, filldir);
459 static int usbdevfs_bus_readdir(struct file *filp, void *dirent, filldir_t filldir)
461 struct inode *inode = filp->f_dentry->d_inode;
462 unsigned long ino = inode->i_ino;
466 if (ITYPE(ino) != IBUS)
468 switch ((unsigned int)filp->f_pos) {
470 if (filldir(dirent, ".", 1, filp->f_pos, ino, DT_DIR) < 0)
476 if (filldir(dirent, "..", 2, filp->f_pos, IROOT, DT_DIR) < 0)
483 bus = usbdevfs_findbus(IBUSNR(ino));
484 bus_readdir(bus->root_hub, IDEVICE | ((bus->busnum & 0xff) << 8), filp->f_pos-2, filp, dirent, filldir);
490 static struct file_operations usbdevfs_root_file_operations = {
491 readdir: usbdevfs_root_readdir,
494 static struct inode_operations usbdevfs_root_inode_operations = {
495 lookup: usbdevfs_root_lookup,
498 static struct file_operations usbdevfs_bus_file_operations = {
499 readdir: usbdevfs_bus_readdir,
502 static struct inode_operations usbdevfs_bus_inode_operations = {
503 lookup: usbdevfs_bus_lookup,
506 static void usbdevfs_read_inode(struct inode *inode)
508 struct special *spec;
510 inode->i_ctime = inode->i_mtime = inode->i_atime = CURRENT_TIME;
511 inode->i_mode = S_IFREG;
512 inode->i_gid = inode->i_uid = 0;
513 inode->u.usbdev_i.p.dev = NULL;
514 inode->u.usbdev_i.p.bus = NULL;
515 switch (ITYPE(inode->i_ino)) {
517 if (inode->i_ino == IROOT) {
518 inode->i_op = &usbdevfs_root_inode_operations;
519 inode->i_fop = &usbdevfs_root_file_operations;
520 inode->i_mode = S_IFDIR | S_IRUGO | S_IXUGO;
523 if (inode->i_ino <= IROOT || inode->i_ino > IROOT+NRSPECIAL)
525 spec = &special[inode->i_ino-(IROOT+1)];
526 inode->i_fop = spec->fops;
540 static void usbdevfs_put_super(struct super_block *sb)
542 list_del(&sb->u.usbdevfs_sb.slist);
543 INIT_LIST_HEAD(&sb->u.usbdevfs_sb.slist);
544 while (!list_empty(&sb->u.usbdevfs_sb.ilist))
545 free_inode(list_entry(sb->u.usbdevfs_sb.ilist.next, struct inode, u.usbdev_i.slist));
548 static int usbdevfs_statfs(struct super_block *sb, struct statfs *buf)
550 buf->f_type = USBDEVICE_SUPER_MAGIC;
551 buf->f_bsize = PAGE_SIZE/sizeof(long); /* ??? */
555 buf->f_namelen = NAME_MAX;
559 static int usbdevfs_remount(struct super_block *s, int *flags, char *data)
561 struct list_head *ilist = s->u.usbdevfs_sb.ilist.next;
565 if ((ret = parse_options(s, data))) {
566 printk(KERN_WARNING "usbdevfs: remount parameter error\n");
570 for (; ilist != &s->u.usbdevfs_sb.ilist; ilist = ilist->next) {
571 inode = list_entry(ilist, struct inode, u.usbdev_i.slist);
573 switch (ITYPE(inode->i_ino)) {
575 inode->i_uid = s->u.usbdevfs_sb.listuid;
576 inode->i_gid = s->u.usbdevfs_sb.listgid;
577 inode->i_mode = s->u.usbdevfs_sb.listmode | S_IFREG;
580 inode->i_uid = s->u.usbdevfs_sb.busuid;
581 inode->i_gid = s->u.usbdevfs_sb.busgid;
582 inode->i_mode = s->u.usbdevfs_sb.busmode | S_IFDIR;
585 inode->i_uid = s->u.usbdevfs_sb.devuid;
586 inode->i_gid = s->u.usbdevfs_sb.devgid;
587 inode->i_mode = s->u.usbdevfs_sb.devmode | S_IFREG;
595 static struct super_operations usbdevfs_sops = {
596 read_inode: usbdevfs_read_inode,
597 put_super: usbdevfs_put_super,
598 statfs: usbdevfs_statfs,
599 remount_fs: usbdevfs_remount,
602 struct super_block *usbdevfs_read_super(struct super_block *s, void *data, int silent)
604 struct inode *root_inode, *inode;
605 struct list_head *blist;
609 if (parse_options(s, data)) {
610 printk(KERN_WARNING "usbdevfs: mount parameter error\n");
614 /* fill superblock */
615 s->s_blocksize = 1024;
616 s->s_blocksize_bits = 10;
617 s->s_magic = USBDEVICE_SUPER_MAGIC;
618 s->s_op = &usbdevfs_sops;
619 INIT_LIST_HEAD(&s->u.usbdevfs_sb.slist);
620 INIT_LIST_HEAD(&s->u.usbdevfs_sb.ilist);
621 root_inode = iget(s, IROOT);
624 s->s_root = d_alloc_root(root_inode);
628 list_add_tail(&s->u.usbdevfs_sb.slist, &superlist);
629 for (i = 0; i < NRSPECIAL; i++) {
630 if (!(inode = iget(s, IROOT+1+i)))
632 inode->i_uid = s->u.usbdevfs_sb.listuid;
633 inode->i_gid = s->u.usbdevfs_sb.listgid;
634 inode->i_mode = s->u.usbdevfs_sb.listmode | S_IFREG;
635 special[i].inode = inode;
636 list_add_tail(&inode->u.usbdev_i.slist, &s->u.usbdevfs_sb.ilist);
637 list_add_tail(&inode->u.usbdev_i.dlist, &special[i].inodes);
639 down (&usb_bus_list_lock);
640 for (blist = usb_bus_list.next; blist != &usb_bus_list; blist = blist->next) {
641 bus = list_entry(blist, struct usb_bus, bus_list);
642 new_bus_inode(bus, s);
643 recurse_new_dev_inode(bus->root_hub, s);
645 up (&usb_bus_list_lock);
650 printk("usbdevfs_read_super: get root inode failed\n");
656 * The usbdevfs name is now deprecated (as of 2.4.19).
657 * It will be removed when the 2.7.x development cycle is started.
658 * You have been warned :)
660 static DECLARE_FSTYPE(usbdevice_fs_type, "usbdevfs", usbdevfs_read_super, FS_SINGLE);
661 static DECLARE_FSTYPE(usbfs_type, "usbfs", usbdevfs_read_super, FS_SINGLE);
663 /* --------------------------------------------------------------------- */
665 static void update_special_inodes (void)
668 for (i = 0; i < NRSPECIAL; i++) {
669 struct inode *inode = special[i].inode;
671 inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
676 void usbdevfs_add_bus(struct usb_bus *bus)
678 struct list_head *slist;
681 for (slist = superlist.next; slist != &superlist; slist = slist->next)
682 new_bus_inode(bus, list_entry(slist, struct super_block, u.usbdevfs_sb.slist));
683 update_special_inodes();
685 usbdevfs_conn_disc_event();
688 void usbdevfs_remove_bus(struct usb_bus *bus)
691 while (!list_empty(&bus->inodes))
692 free_inode(list_entry(bus->inodes.next, struct inode, u.usbdev_i.dlist));
693 update_special_inodes();
695 usbdevfs_conn_disc_event();
698 void usbdevfs_add_device(struct usb_device *dev)
700 struct list_head *slist;
703 for (slist = superlist.next; slist != &superlist; slist = slist->next)
704 new_dev_inode(dev, list_entry(slist, struct super_block, u.usbdevfs_sb.slist));
705 update_special_inodes();
707 usbdevfs_conn_disc_event();
710 void usbdevfs_remove_device(struct usb_device *dev)
712 struct dev_state *ds;
713 struct siginfo sinfo;
716 while (!list_empty(&dev->inodes))
717 free_inode(list_entry(dev->inodes.next, struct inode, u.usbdev_i.dlist));
718 while (!list_empty(&dev->filelist)) {
719 ds = list_entry(dev->filelist.next, struct dev_state, list);
721 INIT_LIST_HEAD(&ds->list);
722 down_write(&ds->devsem);
724 up_write(&ds->devsem);
726 sinfo.si_signo = SIGPIPE;
727 sinfo.si_errno = EPIPE;
728 sinfo.si_code = SI_ASYNCIO;
729 sinfo.si_addr = ds->disccontext;
730 send_sig_info(ds->discsignr, &sinfo, ds->disctask);
734 update_special_inodes();
736 usbdevfs_conn_disc_event();
739 /* --------------------------------------------------------------------- */
741 #ifdef CONFIG_PROC_FS
742 static struct proc_dir_entry *usbdir = NULL;
745 int __init usbdevfs_init(void)
749 for (ret = 0; ret < NRSPECIAL; ret++) {
750 INIT_LIST_HEAD(&special[ret].inodes);
752 if ((ret = usb_register(&usbdevfs_driver)))
754 if ((ret = register_filesystem(&usbdevice_fs_type))) {
755 usb_deregister(&usbdevfs_driver);
758 if ((ret = register_filesystem(&usbfs_type))) {
759 usb_deregister(&usbdevfs_driver);
760 unregister_filesystem(&usbdevice_fs_type);
763 #ifdef CONFIG_PROC_FS
764 /* create mount point for usbdevfs */
765 usbdir = proc_mkdir("usb", proc_bus);
770 void __exit usbdevfs_cleanup(void)
772 usb_deregister(&usbdevfs_driver);
773 unregister_filesystem(&usbdevice_fs_type);
774 unregister_filesystem(&usbfs_type);
775 #ifdef CONFIG_PROC_FS
777 remove_proc_entry("usb", proc_bus);
782 module_init(usbdevfs_init);
783 module_exit(usbdevfs_cleanup);