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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/fs/proc/root.c
  3.  *
  4.  *  Copyright (C) 1991, 1992 Linus Torvalds
  5.  *
  6.  *  proc root directory handling functions
  7.  */
  8. #include <asm/uaccess.h>
  9. #include <linux/errno.h>
  10. #include <linux/sched.h>
  11. #include <linux/proc_fs.h>
  12. #include <linux/stat.h>
  13. #include <linux/config.h>
  14. #include <linux/init.h>
  15. #include <linux/module.h>
  16. #include <asm/bitops.h>
  17. struct proc_dir_entry *proc_net, *proc_bus, *proc_root_fs, *proc_root_driver;
  18. #ifdef CONFIG_SYSCTL
  19. struct proc_dir_entry *proc_sys_root;
  20. #endif
  21. static DECLARE_FSTYPE(proc_fs_type, "proc", proc_read_super, FS_SINGLE);
  22. void __init proc_root_init(void)
  23. {
  24. int err = register_filesystem(&proc_fs_type);
  25. if (err)
  26. return;
  27. proc_mnt = kern_mount(&proc_fs_type);
  28. err = PTR_ERR(proc_mnt);
  29. if (IS_ERR(proc_mnt)) {
  30. unregister_filesystem(&proc_fs_type);
  31. return;
  32. }
  33. proc_misc_init();
  34. proc_net = proc_mkdir("net", 0);
  35. #ifdef CONFIG_SYSVIPC
  36. proc_mkdir("sysvipc", 0);
  37. #endif
  38. #ifdef CONFIG_SYSCTL
  39. proc_sys_root = proc_mkdir("sys", 0);
  40. #endif
  41. #if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE)
  42. proc_mkdir("sys/fs", 0);
  43. proc_mkdir("sys/fs/binfmt_misc", 0);
  44. #endif
  45. proc_root_fs = proc_mkdir("fs", 0);
  46. proc_root_driver = proc_mkdir("driver", 0);
  47. #if defined(CONFIG_SUN_OPENPROMFS) || defined(CONFIG_SUN_OPENPROMFS_MODULE)
  48. /* just give it a mountpoint */
  49. proc_mkdir("openprom", 0);
  50. #endif
  51. proc_tty_init();
  52. #ifdef CONFIG_PROC_DEVICETREE
  53. proc_device_tree_init();
  54. #endif
  55. #ifdef CONFIG_PPC_RTAS
  56. proc_rtas_init();
  57. #endif
  58. proc_bus = proc_mkdir("bus", 0);
  59. }
  60. static struct dentry *proc_root_lookup(struct inode * dir, struct dentry * dentry)
  61. {
  62. if (dir->i_ino == PROC_ROOT_INO) { /* check for safety... */
  63. int nlink = proc_root.nlink;
  64. nlink += nr_threads;
  65. dir->i_nlink = nlink;
  66. }
  67. if (!proc_lookup(dir, dentry))
  68. return NULL;
  69. return proc_pid_lookup(dir, dentry);
  70. }
  71. static int proc_root_readdir(struct file * filp,
  72. void * dirent, filldir_t filldir)
  73. {
  74. unsigned int nr = filp->f_pos;
  75. if (nr < FIRST_PROCESS_ENTRY) {
  76. int error = proc_readdir(filp, dirent, filldir);
  77. if (error <= 0)
  78. return error;
  79. filp->f_pos = FIRST_PROCESS_ENTRY;
  80. }
  81. return proc_pid_readdir(filp, dirent, filldir);
  82. }
  83. /*
  84.  * The root /proc directory is special, as it has the
  85.  * <pid> directories. Thus we don't use the generic
  86.  * directory handling functions for that..
  87.  */
  88. static struct file_operations proc_root_operations = {
  89. read:  generic_read_dir,
  90. readdir:  proc_root_readdir,
  91. };
  92. /*
  93.  * proc root can do almost nothing..
  94.  */
  95. static struct inode_operations proc_root_inode_operations = {
  96. lookup: proc_root_lookup,
  97. };
  98. /*
  99.  * This is the root "inode" in the /proc tree..
  100.  */
  101. struct proc_dir_entry proc_root = {
  102. low_ino: PROC_ROOT_INO, 
  103. namelen: 5, 
  104. name: "/proc",
  105. mode: S_IFDIR | S_IRUGO | S_IXUGO, 
  106. nlink: 2, 
  107. proc_iops: &proc_root_inode_operations, 
  108. proc_fops: &proc_root_operations,
  109. parent: &proc_root,
  110. };
  111. #ifdef CONFIG_SYSCTL
  112. EXPORT_SYMBOL(proc_sys_root);
  113. #endif
  114. EXPORT_SYMBOL(proc_symlink);
  115. EXPORT_SYMBOL(proc_mknod);
  116. EXPORT_SYMBOL(proc_mkdir);
  117. EXPORT_SYMBOL(create_proc_entry);
  118. EXPORT_SYMBOL(remove_proc_entry);
  119. EXPORT_SYMBOL(proc_root);
  120. EXPORT_SYMBOL(proc_root_fs);
  121. EXPORT_SYMBOL(proc_net);
  122. EXPORT_SYMBOL(proc_bus);
  123. EXPORT_SYMBOL(proc_root_driver);