blob: a01f08c8c2f38e43b337953a85ae7c6d2757804b [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001// SPDX-License-Identifier: GPL-2.0
Jeff Laytond68e3c42014-09-12 16:40:20 -04002/*
3 * Procfs support for lockd
4 *
5 * Copyright (c) 2014 Jeff Layton <jlayton@primarydata.com>
6 */
7
8#include <linux/fs.h>
9#include <linux/proc_fs.h>
10#include <linux/module.h>
11#include <linux/nsproxy.h>
12#include <net/net_namespace.h>
13
14#include "netns.h"
15#include "procfs.h"
16
17/*
18 * We only allow strings that start with 'Y', 'y', or '1'.
19 */
20static ssize_t
21nlm_end_grace_write(struct file *file, const char __user *buf, size_t size,
22 loff_t *pos)
23{
24 char *data;
25 struct lockd_net *ln = net_generic(current->nsproxy->net_ns,
26 lockd_net_id);
27
28 if (size < 1)
29 return -EINVAL;
30
31 data = simple_transaction_get(file, buf, size);
32 if (IS_ERR(data))
33 return PTR_ERR(data);
34
35 switch(data[0]) {
36 case 'Y':
37 case 'y':
38 case '1':
39 locks_end_grace(&ln->lockd_manager);
40 break;
41 default:
42 return -EINVAL;
43 }
44
45 return size;
46}
47
48static ssize_t
49nlm_end_grace_read(struct file *file, char __user *buf, size_t size,
50 loff_t *pos)
51{
52 struct lockd_net *ln = net_generic(current->nsproxy->net_ns,
53 lockd_net_id);
54 char resp[3];
55
56 resp[0] = list_empty(&ln->lockd_manager.list) ? 'Y' : 'N';
57 resp[1] = '\n';
58 resp[2] = '\0';
59
60 return simple_read_from_buffer(buf, size, pos, resp, sizeof(resp));
61}
62
Alexey Dobriyan97a32532020-02-03 17:37:17 -080063static const struct proc_ops lockd_end_grace_proc_ops = {
64 .proc_write = nlm_end_grace_write,
65 .proc_read = nlm_end_grace_read,
66 .proc_lseek = default_llseek,
67 .proc_release = simple_transaction_release,
Jeff Laytond68e3c42014-09-12 16:40:20 -040068};
69
70int __init
71lockd_create_procfs(void)
72{
73 struct proc_dir_entry *entry;
74
75 entry = proc_mkdir("fs/lockd", NULL);
76 if (!entry)
77 return -ENOMEM;
78 entry = proc_create("nlm_end_grace", S_IRUGO|S_IWUSR, entry,
Alexey Dobriyan97a32532020-02-03 17:37:17 -080079 &lockd_end_grace_proc_ops);
Jeff Laytond68e3c42014-09-12 16:40:20 -040080 if (!entry) {
81 remove_proc_entry("fs/lockd", NULL);
82 return -ENOMEM;
83 }
84 return 0;
85}
86
87void __exit
88lockd_remove_procfs(void)
89{
90 remove_proc_entry("fs/lockd/nlm_end_grace", NULL);
91 remove_proc_entry("fs/lockd", NULL);
92}