ocfs2: fix locking for res->tracking and dlm->tracking_list
[linux/fpc-iii.git] / fs / lockd / procfs.c
blob2a0a98480e39d0d0002f19e373fa4b4b64271d56
1 /*
2 * Procfs support for lockd
4 * Copyright (c) 2014 Jeff Layton <jlayton@primarydata.com>
5 */
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>
13 #include "netns.h"
14 #include "procfs.h"
17 * We only allow strings that start with 'Y', 'y', or '1'.
19 static ssize_t
20 nlm_end_grace_write(struct file *file, const char __user *buf, size_t size,
21 loff_t *pos)
23 char *data;
24 struct lockd_net *ln = net_generic(current->nsproxy->net_ns,
25 lockd_net_id);
27 if (size < 1)
28 return -EINVAL;
30 data = simple_transaction_get(file, buf, size);
31 if (IS_ERR(data))
32 return PTR_ERR(data);
34 switch(data[0]) {
35 case 'Y':
36 case 'y':
37 case '1':
38 locks_end_grace(&ln->lockd_manager);
39 break;
40 default:
41 return -EINVAL;
44 return size;
47 static ssize_t
48 nlm_end_grace_read(struct file *file, char __user *buf, size_t size,
49 loff_t *pos)
51 struct lockd_net *ln = net_generic(current->nsproxy->net_ns,
52 lockd_net_id);
53 char resp[3];
55 resp[0] = list_empty(&ln->lockd_manager.list) ? 'Y' : 'N';
56 resp[1] = '\n';
57 resp[2] = '\0';
59 return simple_read_from_buffer(buf, size, pos, resp, sizeof(resp));
62 static const struct file_operations lockd_end_grace_operations = {
63 .write = nlm_end_grace_write,
64 .read = nlm_end_grace_read,
65 .llseek = default_llseek,
66 .release = simple_transaction_release,
67 .owner = THIS_MODULE,
70 int __init
71 lockd_create_procfs(void)
73 struct proc_dir_entry *entry;
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,
79 &lockd_end_grace_operations);
80 if (!entry) {
81 remove_proc_entry("fs/lockd", NULL);
82 return -ENOMEM;
84 return 0;
87 void __exit
88 lockd_remove_procfs(void)
90 remove_proc_entry("fs/lockd/nlm_end_grace", NULL);
91 remove_proc_entry("fs/lockd", NULL);