procfs.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Procfs support for lockd
  4. *
  5. * Copyright (c) 2014 Jeff Layton <jlayton@primarydata.com>
  6. */
  7. #include <linux/fs.h>
  8. #include <linux/proc_fs.h>
  9. #include <linux/module.h>
  10. #include <linux/nsproxy.h>
  11. #include <net/net_namespace.h>
  12. #include "netns.h"
  13. #include "procfs.h"
  14. /*
  15. * We only allow strings that start with 'Y', 'y', or '1'.
  16. */
  17. static ssize_t
  18. nlm_end_grace_write(struct file *file, const char __user *buf, size_t size,
  19. loff_t *pos)
  20. {
  21. char *data;
  22. struct lockd_net *ln = net_generic(current->nsproxy->net_ns,
  23. lockd_net_id);
  24. if (size < 1)
  25. return -EINVAL;
  26. data = simple_transaction_get(file, buf, size);
  27. if (IS_ERR(data))
  28. return PTR_ERR(data);
  29. switch(data[0]) {
  30. case 'Y':
  31. case 'y':
  32. case '1':
  33. locks_end_grace(&ln->lockd_manager);
  34. break;
  35. default:
  36. return -EINVAL;
  37. }
  38. return size;
  39. }
  40. static ssize_t
  41. nlm_end_grace_read(struct file *file, char __user *buf, size_t size,
  42. loff_t *pos)
  43. {
  44. struct lockd_net *ln = net_generic(current->nsproxy->net_ns,
  45. lockd_net_id);
  46. char resp[3];
  47. resp[0] = list_empty(&ln->lockd_manager.list) ? 'Y' : 'N';
  48. resp[1] = '\n';
  49. resp[2] = '\0';
  50. return simple_read_from_buffer(buf, size, pos, resp, sizeof(resp));
  51. }
  52. static const struct file_operations lockd_end_grace_operations = {
  53. .write = nlm_end_grace_write,
  54. .read = nlm_end_grace_read,
  55. .llseek = default_llseek,
  56. .release = simple_transaction_release,
  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. }