inode.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:20k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*****************************************************************************/
  2. /*
  3.  * inode.c  --  Inode/Dentry functions for the USB device file system.
  4.  *
  5.  * Copyright (C) 2000
  6.  *          Thomas Sailer (sailer@ife.ee.ethz.ch)
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  *
  22.  *  $Id: inode.c,v 1.3 2000/01/11 13:58:25 tom Exp $
  23.  *
  24.  *  History:
  25.  *   0.1  04.01.2000  Created
  26.  */
  27. /*****************************************************************************/
  28. #define __NO_VERSION__
  29. #include <linux/config.h>
  30. #include <linux/module.h>
  31. #include <linux/fs.h>
  32. #include <linux/sched.h>
  33. #include <linux/smp_lock.h>
  34. #include <linux/locks.h>
  35. #include <linux/init.h>
  36. #include <linux/proc_fs.h>
  37. #include <linux/usb.h>
  38. #include <linux/usbdevice_fs.h>
  39. #include <asm/uaccess.h>
  40. /* --------------------------------------------------------------------- */
  41. /*
  42.  * This list of superblocks is still used,
  43.  * but since usbdevfs became FS_SINGLE
  44.  * there is only one super_block.
  45.  */
  46. static LIST_HEAD(superlist);
  47. struct special {
  48. const char *name;
  49. struct file_operations *fops;
  50. struct inode *inode;
  51. struct list_head inodes;
  52. };
  53. static struct special special[] = { 
  54. { "devices", &usbdevfs_devices_fops,  },
  55. { "drivers", &usbdevfs_drivers_fops,  }
  56. };
  57. #define NRSPECIAL (sizeof(special)/sizeof(special[0]))
  58. /* --------------------------------------------------------------------- */
  59. static int dnumber(struct dentry *dentry)
  60. {
  61. const char *name;
  62. unsigned int s;
  63. if (dentry->d_name.len != 3)
  64. return -1;
  65. name = dentry->d_name.name;
  66. if (name[0] < '0' || name[0] > '9' ||
  67.     name[1] < '0' || name[1] > '9' ||
  68.     name[2] < '0' || name[2] > '9')
  69. return -1;
  70. s = name[0] - '0';
  71. s = s * 10 + name[1] - '0';
  72. s = s * 10 + name[2] - '0';
  73. return s;
  74. }
  75. /*
  76.  * utility functions; should be called with the kernel lock held
  77.  * to protect against busses/devices appearing/disappearing
  78.  */
  79. static void new_dev_inode(struct usb_device *dev, struct super_block *sb)
  80. {
  81. struct inode *inode;
  82. unsigned int devnum = dev->devnum;
  83. unsigned int busnum = dev->bus->busnum;
  84. if (devnum < 1 || devnum > 127 || busnum > 255)
  85. return;
  86. inode = iget(sb, IDEVICE | (busnum << 8) | devnum);
  87. if (!inode) {
  88. printk(KERN_ERR "usbdevfs: cannot create inode for bus %u device %un", busnum, devnum);
  89. return;
  90. }
  91. inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
  92. inode->i_uid = sb->u.usbdevfs_sb.devuid;
  93. inode->i_gid = sb->u.usbdevfs_sb.devgid;
  94. inode->i_mode = sb->u.usbdevfs_sb.devmode | S_IFREG;
  95. inode->i_fop = &usbdevfs_device_file_operations;
  96. inode->i_size = sizeof(struct usb_device_descriptor);
  97. inode->u.usbdev_i.p.dev = dev;
  98. list_add_tail(&inode->u.usbdev_i.slist, &sb->u.usbdevfs_sb.ilist);
  99. list_add_tail(&inode->u.usbdev_i.dlist, &dev->inodes);
  100. }
  101. static void recurse_new_dev_inode(struct usb_device *dev, struct super_block *sb)
  102. {
  103. unsigned int i;
  104. if (!dev)
  105. return;
  106. new_dev_inode(dev, sb);
  107. for (i = 0; i < dev->maxchild; i++) {
  108.                 if (!dev->children[i])
  109.                         continue;
  110. recurse_new_dev_inode(dev->children[i], sb);
  111. }
  112. }
  113. static void new_bus_inode(struct usb_bus *bus, struct super_block *sb)
  114. {
  115. struct inode *inode;
  116. unsigned int busnum = bus->busnum;
  117. if (busnum > 255)
  118. return;
  119. inode = iget(sb, IBUS | (busnum << 8));
  120. if (!inode) {
  121. printk(KERN_ERR "usbdevfs: cannot create inode for bus %un", busnum);
  122. return;
  123. }
  124. inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
  125. inode->i_uid = sb->u.usbdevfs_sb.busuid;
  126. inode->i_gid = sb->u.usbdevfs_sb.busgid;
  127. inode->i_mode = sb->u.usbdevfs_sb.busmode | S_IFDIR;
  128. inode->i_op = &usbdevfs_bus_inode_operations;
  129. inode->i_fop = &usbdevfs_bus_file_operations;
  130. inode->u.usbdev_i.p.bus = bus;
  131. list_add_tail(&inode->u.usbdev_i.slist, &sb->u.usbdevfs_sb.ilist);
  132. list_add_tail(&inode->u.usbdev_i.dlist, &bus->inodes);
  133. }
  134. static void free_inode(struct inode *inode)
  135. {
  136. inode->u.usbdev_i.p.bus = NULL;
  137. inode->u.usbdev_i.p.dev = NULL;
  138. inode->i_mode &= ~S_IRWXUGO;
  139. inode->i_uid = inode->i_gid = 0;
  140. inode->i_size = 0;
  141. list_del(&inode->u.usbdev_i.slist);
  142. INIT_LIST_HEAD(&inode->u.usbdev_i.slist);
  143. list_del(&inode->u.usbdev_i.dlist);
  144. INIT_LIST_HEAD(&inode->u.usbdev_i.dlist);
  145. iput(inode);
  146. }
  147. static int parse_options(struct super_block *s, char *data)
  148. {
  149. uid_t devuid = 0, busuid = 0, listuid = 0;
  150. gid_t devgid = 0, busgid = 0, listgid = 0;
  151. umode_t devmode = S_IWUSR | S_IRUGO, busmode = S_IXUGO | S_IRUGO, listmode = S_IRUGO;
  152. char *curopt = NULL, *value;
  153. /* parse options */
  154. if (data)
  155. curopt = strtok(data, ",");
  156. for (; curopt; curopt = strtok(NULL, ",")) {
  157. if ((value = strchr(curopt, '=')) != NULL)
  158. *value++ = 0;
  159. if (!strcmp(curopt, "devuid")) {
  160. if (!value || !value[0])
  161. return -EINVAL;
  162. devuid = simple_strtoul(value, &value, 0);
  163. if (*value)
  164. return -EINVAL;
  165. }
  166. if (!strcmp(curopt, "devgid")) {
  167. if (!value || !value[0])
  168. return -EINVAL;
  169. devgid = simple_strtoul(value, &value, 0);
  170. if (*value)
  171. return -EINVAL;
  172. }
  173. if (!strcmp(curopt, "devmode")) {
  174. if (!value || !value[0])
  175. return -EINVAL;
  176. devmode = simple_strtoul(value, &value, 0) & S_IRWXUGO;
  177. if (*value)
  178. return -EINVAL;
  179. }
  180. if (!strcmp(curopt, "busuid")) {
  181. if (!value || !value[0])
  182. return -EINVAL;
  183. busuid = simple_strtoul(value, &value, 0);
  184. if (*value)
  185. return -EINVAL;
  186. }
  187. if (!strcmp(curopt, "busgid")) {
  188. if (!value || !value[0])
  189. return -EINVAL;
  190. busgid = simple_strtoul(value, &value, 0);
  191. if (*value)
  192. return -EINVAL;
  193. }
  194. if (!strcmp(curopt, "busmode")) {
  195. if (!value || !value[0])
  196. return -EINVAL;
  197. busmode = simple_strtoul(value, &value, 0) & S_IRWXUGO;
  198. if (*value)
  199. return -EINVAL;
  200. }
  201. if (!strcmp(curopt, "listuid")) {
  202. if (!value || !value[0])
  203. return -EINVAL;
  204. listuid = simple_strtoul(value, &value, 0);
  205. if (*value)
  206. return -EINVAL;
  207. }
  208. if (!strcmp(curopt, "listgid")) {
  209. if (!value || !value[0])
  210. return -EINVAL;
  211. listgid = simple_strtoul(value, &value, 0);
  212. if (*value)
  213. return -EINVAL;
  214. }
  215. if (!strcmp(curopt, "listmode")) {
  216. if (!value || !value[0])
  217. return -EINVAL;
  218. listmode = simple_strtoul(value, &value, 0) & S_IRWXUGO;
  219. if (*value)
  220. return -EINVAL;
  221. }
  222. }
  223. s->u.usbdevfs_sb.devuid = devuid;
  224. s->u.usbdevfs_sb.devgid = devgid;
  225. s->u.usbdevfs_sb.devmode = devmode;
  226. s->u.usbdevfs_sb.busuid = busuid;
  227. s->u.usbdevfs_sb.busgid = busgid;
  228. s->u.usbdevfs_sb.busmode = busmode;
  229. s->u.usbdevfs_sb.listuid = listuid;
  230. s->u.usbdevfs_sb.listgid = listgid;
  231. s->u.usbdevfs_sb.listmode = listmode;
  232. return 0;
  233. }
  234. static struct usb_bus *usbdevfs_findbus(int busnr)
  235. {
  236.         struct list_head *list;
  237.         struct usb_bus *bus;
  238. down (&usb_bus_list_lock);
  239.         for (list = usb_bus_list.next; list != &usb_bus_list; list = list->next) {
  240.                 bus = list_entry(list, struct usb_bus, bus_list);
  241.                 if (bus->busnum == busnr) {
  242. up (&usb_bus_list_lock);
  243.                         return bus;
  244. }
  245.         }
  246. up (&usb_bus_list_lock);
  247.         return NULL;
  248. }
  249. #if 0
  250. static struct usb_device *finddev(struct usb_device *dev, int devnr)
  251. {
  252.         unsigned int i;
  253.         struct usb_device *d2;
  254.         if (!dev)
  255.                 return NULL;
  256.         if (dev->devnum == devnr)
  257.                 return dev;
  258.         for (i = 0; i < dev->maxchild; i++) {
  259.                 if (!dev->children[i])
  260.                         continue;
  261.                 if ((d2 = finddev(dev->children[i], devnr)))
  262.                         return d2;
  263.         }
  264.         return NULL;
  265. }
  266. static struct usb_device *usbdevfs_finddevice(struct usb_bus *bus, int devnr)
  267. {
  268.         return finddev(bus->root_hub, devnr);
  269. }
  270. #endif
  271. /* --------------------------------------------------------------------- */
  272. static int usbdevfs_revalidate(struct dentry *dentry, int flags)
  273. {
  274. struct inode *inode = dentry->d_inode;
  275.         if (!inode)
  276.                 return 0;
  277. if (ITYPE(inode->i_ino) == IBUS && !inode->u.usbdev_i.p.bus)
  278. return 0;
  279. if (ITYPE(inode->i_ino) == IDEVICE && !inode->u.usbdev_i.p.dev)
  280. return 0;
  281. return 1;
  282. }
  283. static struct dentry_operations usbdevfs_dentry_operations = {
  284. d_revalidate: usbdevfs_revalidate,
  285. };
  286. static struct dentry *usbdevfs_root_lookup(struct inode *dir, struct dentry *dentry)
  287. {
  288. int busnr;
  289. unsigned long ino = 0;
  290. unsigned int i;
  291. struct inode *inode;
  292. /* sanity check */
  293. if (dir->i_ino != IROOT)
  294. return ERR_PTR(-EINVAL);
  295. dentry->d_op = &usbdevfs_dentry_operations;
  296. busnr = dnumber(dentry);
  297. if (busnr >= 0 && busnr <= 255)
  298. ino = IBUS | (busnr << 8);
  299. if (!ino) {
  300. for (i = 0; i < NRSPECIAL; i++) {
  301. if (strlen(special[i].name) == dentry->d_name.len && 
  302.     !strncmp(special[i].name, dentry->d_name.name, dentry->d_name.len)) {
  303. ino = ISPECIAL | (i + IROOT + 1);
  304. break;
  305. }
  306. }
  307. }
  308. if (!ino)
  309. return ERR_PTR(-ENOENT);
  310. inode = iget(dir->i_sb, ino);
  311. if (!inode)
  312. return ERR_PTR(-EINVAL);
  313. if (inode && ITYPE(ino) == IBUS && inode->u.usbdev_i.p.bus == NULL) {
  314. iput(inode);
  315. inode = NULL;
  316. }
  317. d_add(dentry, inode);
  318. return NULL;
  319. }
  320. static struct dentry *usbdevfs_bus_lookup(struct inode *dir, struct dentry *dentry)
  321. {
  322. struct inode *inode;
  323. int devnr;
  324. /* sanity check */
  325. if (ITYPE(dir->i_ino) != IBUS)
  326. return ERR_PTR(-EINVAL);
  327. dentry->d_op = &usbdevfs_dentry_operations;
  328. devnr = dnumber(dentry);
  329. if (devnr < 1 || devnr > 127)
  330. return ERR_PTR(-ENOENT);
  331. inode = iget(dir->i_sb, IDEVICE | (dir->i_ino & (0xff << 8)) | devnr);
  332. if (!inode)
  333. return ERR_PTR(-EINVAL);
  334. if (inode && inode->u.usbdev_i.p.dev == NULL) {
  335. iput(inode);
  336. inode = NULL;
  337. }
  338. d_add(dentry, inode);
  339. return NULL;
  340. }
  341. static int usbdevfs_root_readdir(struct file *filp, void *dirent, filldir_t filldir)
  342. {
  343. struct inode *inode = filp->f_dentry->d_inode;
  344. unsigned long ino = inode->i_ino;
  345. struct special *spec;
  346. struct list_head *list;
  347. struct usb_bus *bus;
  348. char numbuf[8];
  349. unsigned int i;
  350. /* sanity check */
  351. if (ino != IROOT)
  352. return -EINVAL;
  353. i = filp->f_pos;
  354. switch (i) {
  355. case 0:
  356. if (filldir(dirent, ".", 1, i, IROOT, DT_DIR) < 0)
  357. return 0;
  358. filp->f_pos++;
  359. i++;
  360. /* fall through */
  361. case 1:
  362. if (filldir(dirent, "..", 2, i, IROOT, DT_DIR) < 0)
  363. return 0;
  364. filp->f_pos++;
  365. i++;
  366. /* fall through */
  367. default:
  368. while (i >= 2 && i < 2+NRSPECIAL) {
  369. spec = &special[filp->f_pos-2];
  370. if (filldir(dirent, spec->name, strlen(spec->name), i, ISPECIAL | (filp->f_pos-2+IROOT), DT_UNKNOWN) < 0)
  371. return 0;
  372. filp->f_pos++;
  373. i++;
  374. }
  375. if (i < 2+NRSPECIAL)
  376. return 0;
  377. i -= 2+NRSPECIAL;
  378. down (&usb_bus_list_lock);
  379. for (list = usb_bus_list.next; list != &usb_bus_list; list = list->next) {
  380. if (i > 0) {
  381. i--;
  382. continue;
  383. }
  384. bus = list_entry(list, struct usb_bus, bus_list);
  385. sprintf(numbuf, "%03d", bus->busnum);
  386. if (filldir(dirent, numbuf, 3, filp->f_pos, IBUS | ((bus->busnum & 0xff) << 8), DT_UNKNOWN) < 0)
  387. break;
  388. filp->f_pos++;
  389. }
  390. up (&usb_bus_list_lock);
  391. return 0;
  392. }
  393. }
  394. static int bus_readdir(struct usb_device *dev, unsigned long ino, int pos, struct file *filp, void *dirent, filldir_t filldir)
  395. {
  396. char numbuf[8];
  397. unsigned int i;
  398. if (!dev)
  399. return pos;
  400. sprintf(numbuf, "%03d", dev->devnum);
  401. if (pos > 0)
  402. pos--;
  403. else {
  404. if (filldir(dirent, numbuf, 3, filp->f_pos, ino | (dev->devnum & 0xff), DT_UNKNOWN) < 0)
  405. return -1;
  406. filp->f_pos++;
  407. }
  408. for (i = 0; i < dev->maxchild; i++) {
  409. if (!dev->children[i])
  410. continue;
  411. pos = bus_readdir(dev->children[i], ino, pos, filp, dirent, filldir);
  412. if (pos < 0)
  413. return -1;
  414. }
  415. return pos;
  416. }
  417. static int usbdevfs_bus_readdir(struct file *filp, void *dirent, filldir_t filldir)
  418. {
  419. struct inode *inode = filp->f_dentry->d_inode;
  420. unsigned long ino = inode->i_ino;
  421. struct usb_bus *bus;
  422. /* sanity check */
  423. if (ITYPE(ino) != IBUS)
  424. return -EINVAL;
  425. switch ((unsigned int)filp->f_pos) {
  426. case 0:
  427. if (filldir(dirent, ".", 1, filp->f_pos, ino, DT_DIR) < 0)
  428. return 0;
  429. filp->f_pos++;
  430. /* fall through */
  431. case 1:
  432. if (filldir(dirent, "..", 2, filp->f_pos, IROOT, DT_DIR) < 0)
  433. return 0;
  434. filp->f_pos++;
  435. /* fall through */
  436. default:
  437. lock_kernel();
  438. bus = usbdevfs_findbus(IBUSNR(ino));
  439. bus_readdir(bus->root_hub, IDEVICE | ((bus->busnum & 0xff) << 8), filp->f_pos-2, filp, dirent, filldir);
  440. unlock_kernel();
  441. return 0;
  442. }
  443. }
  444. static struct file_operations usbdevfs_root_file_operations = {
  445. readdir: usbdevfs_root_readdir,
  446. };
  447. static struct inode_operations usbdevfs_root_inode_operations = {
  448. lookup: usbdevfs_root_lookup,
  449. };
  450. static struct file_operations usbdevfs_bus_file_operations = {
  451. readdir: usbdevfs_bus_readdir,
  452. };
  453. static struct inode_operations usbdevfs_bus_inode_operations = {
  454. lookup: usbdevfs_bus_lookup,
  455. };
  456. static void usbdevfs_read_inode(struct inode *inode)
  457. {
  458. struct special *spec;
  459. inode->i_ctime = inode->i_mtime = inode->i_atime = CURRENT_TIME;
  460. inode->i_mode = S_IFREG;
  461. inode->i_gid = inode->i_uid = 0;
  462. INIT_LIST_HEAD(&inode->u.usbdev_i.dlist);
  463. INIT_LIST_HEAD(&inode->u.usbdev_i.slist);
  464. inode->u.usbdev_i.p.dev = NULL;
  465. inode->u.usbdev_i.p.bus = NULL;
  466. switch (ITYPE(inode->i_ino)) {
  467. case ISPECIAL:
  468. if (inode->i_ino == IROOT) {
  469. inode->i_op = &usbdevfs_root_inode_operations;
  470. inode->i_fop = &usbdevfs_root_file_operations;
  471. inode->i_mode = S_IFDIR | S_IRUGO | S_IXUGO;
  472. return;
  473. }
  474. if (inode->i_ino <= IROOT || inode->i_ino > IROOT+NRSPECIAL)
  475. return;
  476. spec = &special[inode->i_ino-(IROOT+1)];
  477. inode->i_fop = spec->fops;
  478. return;
  479. case IDEVICE:
  480. return;
  481. case IBUS:
  482. return;
  483. default:
  484. return;
  485.         }
  486. }
  487. static void usbdevfs_put_super(struct super_block *sb)
  488. {
  489. list_del(&sb->u.usbdevfs_sb.slist);
  490. INIT_LIST_HEAD(&sb->u.usbdevfs_sb.slist);
  491. while (!list_empty(&sb->u.usbdevfs_sb.ilist))
  492. free_inode(list_entry(sb->u.usbdevfs_sb.ilist.next, struct inode, u.usbdev_i.slist));
  493. }
  494. static int usbdevfs_statfs(struct super_block *sb, struct statfs *buf)
  495. {
  496.         buf->f_type = USBDEVICE_SUPER_MAGIC;
  497.         buf->f_bsize = PAGE_SIZE/sizeof(long);   /* ??? */
  498.         buf->f_bfree = 0;
  499.         buf->f_bavail = 0;
  500.         buf->f_ffree = 0;
  501.         buf->f_namelen = NAME_MAX;
  502.         return 0;
  503. }
  504. static int usbdevfs_remount(struct super_block *s, int *flags, char *data)
  505. {
  506. struct list_head *ilist = s->u.usbdevfs_sb.ilist.next;
  507. struct inode *inode;
  508. int ret;
  509. if ((ret = parse_options(s, data))) {
  510. printk(KERN_WARNING "usbdevfs: remount parameter errorn");
  511. return ret;
  512. }
  513. for (; ilist != &s->u.usbdevfs_sb.ilist; ilist = ilist->next) {
  514. inode = list_entry(ilist, struct inode, u.usbdev_i.slist);
  515. switch (ITYPE(inode->i_ino)) {
  516. case ISPECIAL :
  517. inode->i_uid = s->u.usbdevfs_sb.listuid;
  518. inode->i_gid = s->u.usbdevfs_sb.listgid;
  519. inode->i_mode = s->u.usbdevfs_sb.listmode | S_IFREG;
  520. break;
  521. case IBUS :
  522. inode->i_uid = s->u.usbdevfs_sb.busuid;
  523. inode->i_gid = s->u.usbdevfs_sb.busgid;
  524. inode->i_mode = s->u.usbdevfs_sb.busmode | S_IFDIR;
  525. break;
  526. case IDEVICE :
  527. inode->i_uid = s->u.usbdevfs_sb.devuid;
  528. inode->i_gid = s->u.usbdevfs_sb.devgid;
  529. inode->i_mode = s->u.usbdevfs_sb.devmode | S_IFREG;
  530. break;
  531. }
  532. }
  533. return 0;
  534. }
  535. static struct super_operations usbdevfs_sops = { 
  536. read_inode: usbdevfs_read_inode,
  537. put_super: usbdevfs_put_super,
  538. statfs: usbdevfs_statfs,
  539. remount_fs: usbdevfs_remount,
  540. };
  541. struct super_block *usbdevfs_read_super(struct super_block *s, void *data, int silent)
  542. {
  543.         struct inode *root_inode, *inode;
  544. struct list_head *blist;
  545. struct usb_bus *bus;
  546. unsigned int i;
  547. if (parse_options(s, data)) {
  548. printk(KERN_WARNING "usbdevfs: mount parameter errorn");
  549. return NULL;
  550. }
  551. /* fill superblock */
  552.         s->s_blocksize = 1024;
  553.         s->s_blocksize_bits = 10;
  554.         s->s_magic = USBDEVICE_SUPER_MAGIC;
  555.         s->s_op = &usbdevfs_sops;
  556. INIT_LIST_HEAD(&s->u.usbdevfs_sb.slist);
  557. INIT_LIST_HEAD(&s->u.usbdevfs_sb.ilist);
  558. root_inode = iget(s, IROOT);
  559.         if (!root_inode)
  560.                 goto out_no_root;
  561.         s->s_root = d_alloc_root(root_inode);
  562.         if (!s->s_root)
  563.                 goto out_no_root;
  564. list_add_tail(&s->u.usbdevfs_sb.slist, &superlist);
  565. for (i = 0; i < NRSPECIAL; i++) {
  566. if (!(inode = iget(s, IROOT+1+i)))
  567. continue;
  568. inode->i_uid = s->u.usbdevfs_sb.listuid;
  569. inode->i_gid = s->u.usbdevfs_sb.listgid;
  570. inode->i_mode = s->u.usbdevfs_sb.listmode | S_IFREG;
  571. special[i].inode = inode;
  572. list_add_tail(&inode->u.usbdev_i.slist, &s->u.usbdevfs_sb.ilist);
  573. list_add_tail(&inode->u.usbdev_i.dlist, &special[i].inodes);
  574. }
  575. down (&usb_bus_list_lock);
  576. for (blist = usb_bus_list.next; blist != &usb_bus_list; blist = blist->next) {
  577. bus = list_entry(blist, struct usb_bus, bus_list);
  578. new_bus_inode(bus, s);
  579. recurse_new_dev_inode(bus->root_hub, s);
  580. }
  581. up (&usb_bus_list_lock);
  582.         return s;
  583.  out_no_root:
  584.         printk("usbdevfs_read_super: get root inode failedn");
  585.         iput(root_inode);
  586.         return NULL;
  587. }
  588. static DECLARE_FSTYPE(usbdevice_fs_type, "usbdevfs", usbdevfs_read_super, FS_SINGLE);
  589. /* --------------------------------------------------------------------- */
  590. static void update_special_inodes (void)
  591. {
  592. int i;
  593. for (i = 0; i < NRSPECIAL; i++) {
  594. struct inode *inode = special[i].inode;
  595. if (inode)
  596. inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
  597. }
  598. }
  599. void usbdevfs_add_bus(struct usb_bus *bus)
  600. {
  601. struct list_head *slist;
  602. lock_kernel();
  603. for (slist = superlist.next; slist != &superlist; slist = slist->next)
  604. new_bus_inode(bus, list_entry(slist, struct super_block, u.usbdevfs_sb.slist));
  605. update_special_inodes();
  606. unlock_kernel();
  607. usbdevfs_conn_disc_event();
  608. }
  609. void usbdevfs_remove_bus(struct usb_bus *bus)
  610. {
  611. lock_kernel();
  612. while (!list_empty(&bus->inodes))
  613. free_inode(list_entry(bus->inodes.next, struct inode, u.usbdev_i.dlist));
  614. update_special_inodes();
  615. unlock_kernel();
  616. usbdevfs_conn_disc_event();
  617. }
  618. void usbdevfs_add_device(struct usb_device *dev)
  619. {
  620. struct list_head *slist;
  621. lock_kernel();
  622. for (slist = superlist.next; slist != &superlist; slist = slist->next)
  623. new_dev_inode(dev, list_entry(slist, struct super_block, u.usbdevfs_sb.slist));
  624. update_special_inodes();
  625. unlock_kernel();
  626. usbdevfs_conn_disc_event();
  627. }
  628. void usbdevfs_remove_device(struct usb_device *dev)
  629. {
  630. struct dev_state *ds;
  631. struct siginfo sinfo;
  632. lock_kernel();
  633. while (!list_empty(&dev->inodes))
  634. free_inode(list_entry(dev->inodes.next, struct inode, u.usbdev_i.dlist));
  635. while (!list_empty(&dev->filelist)) {
  636. ds = list_entry(dev->filelist.next, struct dev_state, list);
  637. list_del(&ds->list);
  638. INIT_LIST_HEAD(&ds->list);
  639. down_write(&ds->devsem);
  640. ds->dev = NULL;
  641. up_write(&ds->devsem);
  642. if (ds->discsignr) {
  643. sinfo.si_signo = SIGPIPE;
  644. sinfo.si_errno = EPIPE;
  645. sinfo.si_code = SI_ASYNCIO;
  646. sinfo.si_addr = ds->disccontext;
  647. send_sig_info(ds->discsignr, &sinfo, ds->disctask);
  648. }
  649. }
  650. update_special_inodes();
  651. unlock_kernel();
  652. usbdevfs_conn_disc_event();
  653. }
  654. /* --------------------------------------------------------------------- */
  655. #ifdef CONFIG_PROC_FS
  656. static struct proc_dir_entry *usbdir = NULL;
  657. #endif
  658. int __init usbdevfs_init(void)
  659. {
  660. int ret;
  661. for (ret = 0; ret < NRSPECIAL; ret++) {
  662. INIT_LIST_HEAD(&special[ret].inodes);
  663. }
  664. if ((ret = usb_register(&usbdevfs_driver)))
  665. return ret;
  666. if ((ret = register_filesystem(&usbdevice_fs_type))) {
  667. usb_deregister(&usbdevfs_driver);
  668. return ret;
  669. }
  670. #ifdef CONFIG_PROC_FS
  671. /* create mount point for usbdevfs */
  672. usbdir = proc_mkdir("usb", proc_bus);
  673. #endif
  674. return ret;
  675. }
  676. void __exit usbdevfs_cleanup(void)
  677. {
  678. usb_deregister(&usbdevfs_driver);
  679. unregister_filesystem(&usbdevice_fs_type);
  680. #ifdef CONFIG_PROC_FS
  681.         if (usbdir)
  682.                 remove_proc_entry("usb", proc_bus);
  683. #endif
  684. }
  685. #if 0
  686. module_init(usbdevfs_init);
  687. module_exit(usbdevfs_cleanup);
  688. #endif