procfs.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /*
  2. * Procfs support for lockd
  3. *
  4. * Copyright (c) 2014 Jeff Layton <jlayton@primarydata.com>
  5. */
  6. #include <linux/fs.h>
  7. #include <linux/proc_fs.h>
  8. #include <linux/module.h>
  9. #include <linux/nsproxy.h>
  10. #include <net/net_namespace.h>
  11. #include "netns.h"
  12. #include "procfs.h"
  13. /*
  14. * We only allow strings that start with 'Y', 'y', or '1'.
  15. */
  16. static ssize_t
  17. nlm_end_grace_write(struct file *file, const char __user *buf, size_t size,
  18. loff_t *pos)
  19. {
  20. char *data;
  21. struct lockd_net *ln = net_generic(current->nsproxy->net_ns,
  22. lockd_net_id);
  23. if (size < 1)
  24. return -EINVAL;
  25. data = simple_transaction_get(file, buf, size);
  26. if (IS_ERR(data))
  27. return PTR_ERR(data);
  28. switch(data[0]) {
  29. case 'Y':
  30. case 'y':
  31. case '1':
  32. locks_end_grace(&ln->lockd_manager);
  33. break;
  34. default:
  35. return -EINVAL;
  36. }
  37. return size;
  38. }
  39. static ssize_t
  40. nlm_end_grace_read(struct file *file, char __user *buf, size_t size,
  41. loff_t *pos)
  42. {
  43. struct lockd_net *ln = net_generic(current->nsproxy->net_ns,
  44. lockd_net_id);
  45. char resp[3];
  46. resp[0] = list_empty(&ln->lockd_manager.list) ? 'Y' : 'N';
  47. resp[1] = '\n';
  48. resp[2] = '\0';
  49. return simple_read_from_buffer(buf, size, pos, resp, sizeof(resp));
  50. }
  51. static const struct file_operations lockd_end_grace_operations = {
  52. .write = nlm_end_grace_write,
  53. .read = nlm_end_grace_read,
  54. .llseek = default_llseek,
  55. .release = simple_transaction_release,
  56. .owner = THIS_MODULE,
  57. };
  58. int __init
  59. lockd_create_procfs(void)
  60. {
  61. struct proc_dir_entry *entry;
  62. entry = proc_mkdir("fs/lockd", NULL);
  63. if (!entry)
  64. return -ENOMEM;
  65. entry = proc_create("nlm_end_grace", S_IRUGO|S_IWUSR, entry,
  66. &lockd_end_grace_operations);
  67. if (!entry) {
  68. remove_proc_entry("fs/lockd", NULL);
  69. return -ENOMEM;
  70. }
  71. return 0;
  72. }
  73. void __exit
  74. lockd_remove_procfs(void)
  75. {
  76. remove_proc_entry("fs/lockd/nlm_end_grace", NULL);
  77. remove_proc_entry("fs/lockd", NULL);
  78. }