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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/net/sunrpc/sysctl.c
  3.  *
  4.  * Sysctl interface to sunrpc module. This is for debugging only now.
  5.  *
  6.  * I would prefer to register the sunrpc table below sys/net, but that's
  7.  * impossible at the moment.
  8.  */
  9. #include <linux/config.h>
  10. #include <linux/version.h>
  11. #include <linux/types.h>
  12. #include <linux/linkage.h>
  13. #include <linux/ctype.h>
  14. #include <linux/fs.h>
  15. #include <linux/sysctl.h>
  16. #define __NO_VERSION__
  17. #include <linux/module.h>
  18. #include <asm/uaccess.h>
  19. #include <linux/sunrpc/types.h>
  20. #include <linux/sunrpc/sched.h>
  21. #include <linux/sunrpc/stats.h>
  22. /*
  23.  * Declare the debug flags here
  24.  */
  25. unsigned int rpc_debug;
  26. unsigned int nfs_debug;
  27. unsigned int nfsd_debug;
  28. unsigned int nlm_debug;
  29. #ifdef RPC_DEBUG
  30. static struct ctl_table_header *sunrpc_table_header;
  31. static ctl_table sunrpc_table[];
  32. void
  33. rpc_register_sysctl(void)
  34. {
  35. if (!sunrpc_table_header) {
  36. sunrpc_table_header = register_sysctl_table(sunrpc_table, 1);
  37. #ifdef CONFIG_PROC_FS
  38. if (sunrpc_table[0].de)
  39. sunrpc_table[0].de->owner = THIS_MODULE;
  40. #endif
  41. }
  42. }
  43. void
  44. rpc_unregister_sysctl(void)
  45. {
  46. if (sunrpc_table_header) {
  47. unregister_sysctl_table(sunrpc_table_header);
  48. sunrpc_table_header = NULL;
  49. }
  50. }
  51. static int
  52. proc_dodebug(ctl_table *table, int write, struct file *file,
  53. void *buffer, size_t *lenp)
  54. {
  55. char tmpbuf[20], *p, c;
  56. unsigned int value;
  57. size_t left, len;
  58. if ((file->f_pos && !write) || !*lenp) {
  59. *lenp = 0;
  60. return 0;
  61. }
  62. left = *lenp;
  63. if (write) {
  64. if (!access_ok(VERIFY_READ, buffer, left))
  65. return -EFAULT;
  66. p = (char *) buffer;
  67. while (left && __get_user(c, p) >= 0 && isspace(c))
  68. left--, p++;
  69. if (!left)
  70. goto done;
  71. if (left > sizeof(tmpbuf) - 1)
  72. return -EINVAL;
  73. copy_from_user(tmpbuf, p, left);
  74. tmpbuf[left] = '';
  75. for (p = tmpbuf, value = 0; '0' <= *p && *p <= '9'; p++, left--)
  76. value = 10 * value + (*p - '0');
  77. if (*p && !isspace(*p))
  78. return -EINVAL;
  79. while (left && isspace(*p))
  80. left--, p++;
  81. *(unsigned int *) table->data = value;
  82. /* Display the RPC tasks on writing to rpc_debug */
  83. if (table->ctl_name == CTL_RPCDEBUG) {
  84. rpc_show_tasks();
  85. }
  86. } else {
  87. if (!access_ok(VERIFY_WRITE, buffer, left))
  88. return -EFAULT;
  89. len = sprintf(tmpbuf, "%d", *(unsigned int *) table->data);
  90. if (len > left)
  91. len = left;
  92. copy_to_user(buffer, tmpbuf, len);
  93. if ((left -= len) > 0) {
  94. put_user('n', (char *)buffer + len);
  95. left--;
  96. }
  97. }
  98. done:
  99. *lenp -= left;
  100. file->f_pos += *lenp;
  101. return 0;
  102. }
  103. #define DIRENTRY(nam1, nam2, child)
  104. {CTL_##nam1, #nam2, NULL, 0, 0555, child }
  105. #define DBGENTRY(nam1, nam2)
  106. {CTL_##nam1##DEBUG, #nam2 "_debug", &nam2##_debug, sizeof(int),
  107.  0644, NULL, &proc_dodebug}
  108. static ctl_table debug_table[] = {
  109. DBGENTRY(RPC,  rpc),
  110. DBGENTRY(NFS,  nfs),
  111. DBGENTRY(NFSD, nfsd),
  112. DBGENTRY(NLM,  nlm),
  113. {0}
  114. };
  115. static ctl_table sunrpc_table[] = {
  116. DIRENTRY(SUNRPC, sunrpc, debug_table),
  117. {0}
  118. };
  119. #endif