Branch data Line data Source code
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 : :
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 : : */
20 : : static ssize_t
21 : 0 : nlm_end_grace_write(struct file *file, const char __user *buf, size_t size,
22 : : loff_t *pos)
23 : : {
24 : 0 : char *data;
25 : 0 : struct lockd_net *ln = net_generic(current->nsproxy->net_ns,
26 : : lockd_net_id);
27 : :
28 [ # # ]: 0 : if (size < 1)
29 : : return -EINVAL;
30 : :
31 : 0 : data = simple_transaction_get(file, buf, size);
32 [ # # ]: 0 : if (IS_ERR(data))
33 : 0 : return PTR_ERR(data);
34 : :
35 [ # # ]: 0 : switch(data[0]) {
36 : 0 : case 'Y':
37 : : case 'y':
38 : : case '1':
39 : 0 : locks_end_grace(&ln->lockd_manager);
40 : 0 : break;
41 : : default:
42 : : return -EINVAL;
43 : : }
44 : :
45 : 0 : return size;
46 : : }
47 : :
48 : : static ssize_t
49 : 0 : nlm_end_grace_read(struct file *file, char __user *buf, size_t size,
50 : : loff_t *pos)
51 : : {
52 : 0 : struct lockd_net *ln = net_generic(current->nsproxy->net_ns,
53 : : lockd_net_id);
54 : 0 : char resp[3];
55 : :
56 [ # # ]: 0 : resp[0] = list_empty(&ln->lockd_manager.list) ? 'Y' : 'N';
57 : 0 : resp[1] = '\n';
58 : 0 : resp[2] = '\0';
59 : :
60 : 0 : return simple_read_from_buffer(buf, size, pos, resp, sizeof(resp));
61 : : }
62 : :
63 : : static 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,
68 : : };
69 : :
70 : : int __init
71 : 78 : lockd_create_procfs(void)
72 : : {
73 : 78 : struct proc_dir_entry *entry;
74 : :
75 : 78 : entry = proc_mkdir("fs/lockd", NULL);
76 [ + - ]: 78 : if (!entry)
77 : : return -ENOMEM;
78 : 78 : entry = proc_create("nlm_end_grace", S_IRUGO|S_IWUSR, entry,
79 : : &lockd_end_grace_proc_ops);
80 [ - + ]: 78 : if (!entry) {
81 : 0 : remove_proc_entry("fs/lockd", NULL);
82 : 0 : return -ENOMEM;
83 : : }
84 : : return 0;
85 : : }
86 : :
87 : : void __exit
88 : 0 : lockd_remove_procfs(void)
89 : : {
90 : 0 : remove_proc_entry("fs/lockd/nlm_end_grace", NULL);
91 : 0 : remove_proc_entry("fs/lockd", NULL);
92 : 0 : }
|