/core/10.5/fusefs/fuse_sysctl.c

http://macfuse.googlecode.com/ · C · 308 lines · 253 code · 41 blank · 14 comment · 30 complexity · ac2e17a9af13284f272aca12ee9586e1 MD5 · raw file

  1. /*
  2. * Copyright (C) 2006-2008 Google. All Rights Reserved.
  3. * Amit Singh <singh@>
  4. */
  5. #include <sys/systm.h>
  6. #include <sys/types.h>
  7. #include <sys/sysctl.h>
  8. #include "fuse.h"
  9. #include "fuse_device.h"
  10. #include "fuse_sysctl.h"
  11. #include <fuse_param.h>
  12. #include <fuse_version.h>
  13. /* NB: none of these are bigger than unsigned 32-bit. */
  14. int32_t fuse_admin_group = 0; // rw
  15. int32_t fuse_allow_other = 0; // rw
  16. uint32_t fuse_api_major = FUSE_KERNEL_VERSION; // r
  17. uint32_t fuse_api_minor = FUSE_KERNEL_MINOR_VERSION; // r
  18. int32_t fuse_fh_current = 0; // r
  19. uint32_t fuse_fh_reuse_count = 0; // r
  20. uint32_t fuse_fh_upcall_count = 0; // r
  21. uint32_t fuse_fh_zombies = 0; // r
  22. int32_t fuse_iov_credit = FUSE_DEFAULT_IOV_CREDIT; // rw
  23. int32_t fuse_iov_current = 0; // r
  24. uint32_t fuse_iov_permanent_bufsize = FUSE_DEFAULT_IOV_PERMANENT_BUFSIZE; // rw
  25. int32_t fuse_kill = -1; // w
  26. int32_t fuse_print_vnodes = -1; // w
  27. uint32_t fuse_lookup_cache_hits = 0; // r
  28. uint32_t fuse_lookup_cache_misses = 0; // r
  29. uint32_t fuse_lookup_cache_overrides = 0; // r
  30. uint32_t fuse_max_freetickets = FUSE_DEFAULT_MAX_FREE_TICKETS; // rw
  31. uint32_t fuse_max_tickets = 0; // rw
  32. int32_t fuse_mount_count = 0; // r
  33. int32_t fuse_memory_allocated = 0; // r
  34. int32_t fuse_realloc_count = 0; // r
  35. int32_t fuse_tickets_current = 0; // r
  36. uint32_t fuse_userkernel_bufsize = FUSE_DEFAULT_USERKERNEL_BUFSIZE; // rw
  37. int32_t fuse_vnodes_current = 0; // r
  38. SYSCTL_DECL(_macfuse);
  39. SYSCTL_NODE(, OID_AUTO, macfuse, CTLFLAG_RW, 0,
  40. "MacFUSE Sysctl Interface");
  41. SYSCTL_NODE(_macfuse, OID_AUTO, control, CTLFLAG_RW, 0,
  42. "MacFUSE Controls");
  43. SYSCTL_NODE(_macfuse, OID_AUTO, counters, CTLFLAG_RW, 0,
  44. "MacFUSE Monotonic Counters");
  45. SYSCTL_NODE(_macfuse, OID_AUTO, resourceusage, CTLFLAG_RW, 0,
  46. "MacFUSE Resource Usage");
  47. SYSCTL_NODE(_macfuse, OID_AUTO, tunables, CTLFLAG_RW, 0,
  48. "MacFUSE Tunables");
  49. SYSCTL_NODE(_macfuse, OID_AUTO, version, CTLFLAG_RW, 0,
  50. "MacFUSE Version Information");
  51. /* fuse.control */
  52. int sysctl_macfuse_control_kill_handler SYSCTL_HANDLER_ARGS;
  53. int sysctl_macfuse_control_print_vnodes_handler SYSCTL_HANDLER_ARGS;
  54. int sysctl_macfuse_tunables_userkernel_bufsize_handler SYSCTL_HANDLER_ARGS;
  55. int
  56. sysctl_macfuse_control_kill_handler SYSCTL_HANDLER_ARGS
  57. {
  58. int error = 0;
  59. (void)oidp;
  60. if (arg1) {
  61. error = SYSCTL_OUT(req, arg1, sizeof(int));
  62. } else {
  63. error = SYSCTL_OUT(req, &arg2, sizeof(int));
  64. }
  65. if (error || !req->newptr) {
  66. return error;
  67. }
  68. if (!arg1) {
  69. error = EPERM;
  70. } else {
  71. error = SYSCTL_IN(req, arg1, sizeof(int));
  72. if (error == 0) {
  73. error = fuse_device_kill(*(int *)arg1, req->p);
  74. }
  75. fuse_kill = -1; /* set it back */
  76. }
  77. return error;
  78. }
  79. int
  80. sysctl_macfuse_control_print_vnodes_handler SYSCTL_HANDLER_ARGS
  81. {
  82. int error = 0;
  83. (void)oidp;
  84. if (arg1) {
  85. error = SYSCTL_OUT(req, arg1, sizeof(uint32_t));
  86. } else {
  87. error = SYSCTL_OUT(req, &arg2, sizeof(uint32_t));
  88. }
  89. if (error || !req->newptr) {
  90. return error;
  91. }
  92. if (!arg1) {
  93. error = EPERM;
  94. } else {
  95. error = SYSCTL_IN(req, arg1, sizeof(int));
  96. if (error == 0) {
  97. error = fuse_device_print_vnodes(*(int *)arg1, req->p);
  98. }
  99. fuse_print_vnodes = -1; /* set it back */
  100. }
  101. return error;
  102. }
  103. int
  104. sysctl_macfuse_tunables_userkernel_bufsize_handler SYSCTL_HANDLER_ARGS
  105. {
  106. int error = 0;
  107. (void)oidp;
  108. if (arg1) {
  109. error = SYSCTL_OUT(req, arg1, sizeof(int));
  110. } else {
  111. error = SYSCTL_OUT(req, &arg2, sizeof(int));
  112. }
  113. if (error || !req->newptr) {
  114. return error;
  115. }
  116. if (!arg1) {
  117. error = EPERM;
  118. } else {
  119. error = SYSCTL_IN(req, arg1, sizeof(uint32_t));
  120. if (error == 0) {
  121. uint32_t incoming = *(uint32_t *)arg1;
  122. incoming = fuse_round_page_32(incoming);
  123. if (incoming > FUSE_MAX_USERKERNEL_BUFSIZE) {
  124. error = E2BIG;
  125. } else if (incoming < FUSE_MIN_USERKERNEL_BUFSIZE) {
  126. error = EINVAL;
  127. } else {
  128. fuse_userkernel_bufsize = incoming;
  129. }
  130. }
  131. }
  132. return error;
  133. }
  134. SYSCTL_PROC(_macfuse_control, // our parent
  135. OID_AUTO, // automatically assign object ID
  136. kill, // our name
  137. // type flag/access flag
  138. (CTLTYPE_INT | CTLFLAG_WR | CTLFLAG_ANYBODY),
  139. &fuse_kill, // location of our data
  140. 0, // argument passed to our handler
  141. // our handler function
  142. sysctl_macfuse_control_kill_handler,
  143. "I", // our data type (integer)
  144. "MacFUSE Controls: Kill the Given File System");
  145. SYSCTL_PROC(_macfuse_control, // our parent
  146. OID_AUTO, // automatically assign object ID
  147. print_vnodes, // our name
  148. // type flag/access flag
  149. (CTLTYPE_INT | CTLFLAG_WR),
  150. &fuse_print_vnodes, // location of our data
  151. 0, // argument passed to our handler
  152. // our handler function
  153. sysctl_macfuse_control_print_vnodes_handler,
  154. "I", // our data type (integer)
  155. "MacFUSE Controls: Print Vnodes for the Given File System");
  156. /* fuse.counters */
  157. SYSCTL_INT(_macfuse_counters, OID_AUTO, filehandle_reuse, CTLFLAG_RD,
  158. &fuse_fh_reuse_count, 0, "");
  159. SYSCTL_INT(_macfuse_counters, OID_AUTO, filehandle_upcalls, CTLFLAG_RD,
  160. &fuse_fh_upcall_count, 0, "");
  161. SYSCTL_INT(_macfuse_counters, OID_AUTO, lookup_cache_hits, CTLFLAG_RD,
  162. &fuse_lookup_cache_hits, 0, "");
  163. SYSCTL_INT(_macfuse_counters, OID_AUTO, lookup_cache_misses, CTLFLAG_RD,
  164. &fuse_lookup_cache_misses, 0, "");
  165. SYSCTL_INT(_macfuse_counters, OID_AUTO, lookup_cache_overrides,
  166. CTLFLAG_RD, &fuse_lookup_cache_overrides, 0, "");
  167. SYSCTL_INT(_macfuse_counters, OID_AUTO, memory_reallocs, CTLFLAG_RD,
  168. &fuse_realloc_count, 0, "");
  169. /* fuse.resourceusage */
  170. SYSCTL_INT(_macfuse_resourceusage, OID_AUTO, filehandles, CTLFLAG_RD,
  171. &fuse_fh_current, 0, "");
  172. SYSCTL_INT(_macfuse_resourceusage, OID_AUTO, filehandles_zombies, CTLFLAG_RD,
  173. &fuse_fh_zombies, 0, "");
  174. SYSCTL_INT(_macfuse_resourceusage, OID_AUTO, ipc_iovs, CTLFLAG_RD,
  175. &fuse_iov_current, 0, "");
  176. SYSCTL_INT(_macfuse_resourceusage, OID_AUTO, ipc_tickets, CTLFLAG_RD,
  177. &fuse_tickets_current, 0, "");
  178. SYSCTL_INT(_macfuse_resourceusage, OID_AUTO, memory_bytes, CTLFLAG_RD,
  179. &fuse_memory_allocated, 0, "");
  180. SYSCTL_INT(_macfuse_resourceusage, OID_AUTO, mounts, CTLFLAG_RD,
  181. &fuse_mount_count, 0, "");
  182. SYSCTL_INT(_macfuse_resourceusage, OID_AUTO, vnodes, CTLFLAG_RD,
  183. &fuse_vnodes_current, 0, "");
  184. /* fuse.tunables */
  185. SYSCTL_INT(_macfuse_tunables, OID_AUTO, admin_group, CTLFLAG_RW,
  186. &fuse_admin_group, 0, "");
  187. SYSCTL_INT(_macfuse_tunables, OID_AUTO, allow_other, CTLFLAG_RW,
  188. &fuse_allow_other, 0, "");
  189. SYSCTL_INT(_macfuse_tunables, OID_AUTO, iov_credit, CTLFLAG_RW,
  190. &fuse_iov_credit, 0, "");
  191. SYSCTL_INT(_macfuse_tunables, OID_AUTO, iov_permanent_bufsize, CTLFLAG_RW,
  192. &fuse_iov_permanent_bufsize, 0, "");
  193. SYSCTL_INT(_macfuse_tunables, OID_AUTO, max_freetickets, CTLFLAG_RW,
  194. &fuse_max_freetickets, 0, "");
  195. SYSCTL_INT(_macfuse_tunables, OID_AUTO, max_tickets, CTLFLAG_RW,
  196. &fuse_max_tickets, 0, "");
  197. SYSCTL_PROC(_macfuse_tunables, // our parent
  198. OID_AUTO, // automatically assign object ID
  199. userkernel_bufsize, // our name
  200. (CTLTYPE_INT | CTLFLAG_WR), // type flag/access flag
  201. &fuse_userkernel_bufsize, // location of our data
  202. 0, // argument passed to our handler
  203. sysctl_macfuse_tunables_userkernel_bufsize_handler,
  204. "I", // our data type (integer)
  205. "MacFUSE Tunables"); // our description
  206. /* fuse.version */
  207. SYSCTL_INT(_macfuse_version, OID_AUTO, api_major, CTLFLAG_RD,
  208. &fuse_api_major, 0, "");
  209. SYSCTL_INT(_macfuse_version, OID_AUTO, api_minor, CTLFLAG_RD,
  210. &fuse_api_minor, 0, "");
  211. SYSCTL_STRING(_macfuse_version, OID_AUTO, number, CTLFLAG_RD,
  212. MACFUSE_VERSION, 0, "");
  213. SYSCTL_STRING(_macfuse_version, OID_AUTO, string, CTLFLAG_RD,
  214. MACFUSE_VERSION ", " MACFUSE_TIMESTAMP, 0, "");
  215. static struct sysctl_oid *fuse_sysctl_list[] =
  216. {
  217. &sysctl__macfuse_control,
  218. &sysctl__macfuse_counters,
  219. &sysctl__macfuse_resourceusage,
  220. &sysctl__macfuse_tunables,
  221. &sysctl__macfuse_version,
  222. &sysctl__macfuse_control_kill,
  223. &sysctl__macfuse_control_print_vnodes,
  224. &sysctl__macfuse_counters_filehandle_reuse,
  225. &sysctl__macfuse_counters_filehandle_upcalls,
  226. &sysctl__macfuse_counters_lookup_cache_hits,
  227. &sysctl__macfuse_counters_lookup_cache_misses,
  228. &sysctl__macfuse_counters_lookup_cache_overrides,
  229. &sysctl__macfuse_counters_memory_reallocs,
  230. &sysctl__macfuse_resourceusage_filehandles,
  231. &sysctl__macfuse_resourceusage_filehandles_zombies,
  232. &sysctl__macfuse_resourceusage_ipc_iovs,
  233. &sysctl__macfuse_resourceusage_ipc_tickets,
  234. &sysctl__macfuse_resourceusage_memory_bytes,
  235. &sysctl__macfuse_resourceusage_mounts,
  236. &sysctl__macfuse_resourceusage_vnodes,
  237. &sysctl__macfuse_tunables_admin_group,
  238. &sysctl__macfuse_tunables_allow_other,
  239. &sysctl__macfuse_tunables_iov_credit,
  240. &sysctl__macfuse_tunables_iov_permanent_bufsize,
  241. &sysctl__macfuse_tunables_max_freetickets,
  242. &sysctl__macfuse_tunables_max_tickets,
  243. &sysctl__macfuse_tunables_userkernel_bufsize,
  244. &sysctl__macfuse_version_api_major,
  245. &sysctl__macfuse_version_api_minor,
  246. &sysctl__macfuse_version_number,
  247. &sysctl__macfuse_version_string,
  248. (struct sysctl_oid *)0
  249. };
  250. void
  251. fuse_sysctl_start(void)
  252. {
  253. int i;
  254. sysctl_register_oid(&sysctl__macfuse);
  255. for (i = 0; fuse_sysctl_list[i]; i++) {
  256. sysctl_register_oid(fuse_sysctl_list[i]);
  257. }
  258. }
  259. void
  260. fuse_sysctl_stop(void)
  261. {
  262. int i;
  263. for (i = 0; fuse_sysctl_list[i]; i++) {
  264. sysctl_unregister_oid(fuse_sysctl_list[i]);
  265. }
  266. sysctl_unregister_oid(&sysctl__macfuse);
  267. }