0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/fs.h>
0009 #include <linux/proc_fs.h>
0010 #include <linux/module.h>
0011 #include <linux/nsproxy.h>
0012 #include <net/net_namespace.h>
0013
0014 #include "netns.h"
0015 #include "procfs.h"
0016
0017
0018
0019
0020 static ssize_t
0021 nlm_end_grace_write(struct file *file, const char __user *buf, size_t size,
0022 loff_t *pos)
0023 {
0024 char *data;
0025 struct lockd_net *ln = net_generic(current->nsproxy->net_ns,
0026 lockd_net_id);
0027
0028 if (size < 1)
0029 return -EINVAL;
0030
0031 data = simple_transaction_get(file, buf, size);
0032 if (IS_ERR(data))
0033 return PTR_ERR(data);
0034
0035 switch(data[0]) {
0036 case 'Y':
0037 case 'y':
0038 case '1':
0039 locks_end_grace(&ln->lockd_manager);
0040 break;
0041 default:
0042 return -EINVAL;
0043 }
0044
0045 return size;
0046 }
0047
0048 static ssize_t
0049 nlm_end_grace_read(struct file *file, char __user *buf, size_t size,
0050 loff_t *pos)
0051 {
0052 struct lockd_net *ln = net_generic(current->nsproxy->net_ns,
0053 lockd_net_id);
0054 char resp[3];
0055
0056 resp[0] = list_empty(&ln->lockd_manager.list) ? 'Y' : 'N';
0057 resp[1] = '\n';
0058 resp[2] = '\0';
0059
0060 return simple_read_from_buffer(buf, size, pos, resp, sizeof(resp));
0061 }
0062
0063 static const struct proc_ops lockd_end_grace_proc_ops = {
0064 .proc_write = nlm_end_grace_write,
0065 .proc_read = nlm_end_grace_read,
0066 .proc_lseek = default_llseek,
0067 .proc_release = simple_transaction_release,
0068 };
0069
0070 int __init
0071 lockd_create_procfs(void)
0072 {
0073 struct proc_dir_entry *entry;
0074
0075 entry = proc_mkdir("fs/lockd", NULL);
0076 if (!entry)
0077 return -ENOMEM;
0078 entry = proc_create("nlm_end_grace", S_IRUGO|S_IWUSR, entry,
0079 &lockd_end_grace_proc_ops);
0080 if (!entry) {
0081 remove_proc_entry("fs/lockd", NULL);
0082 return -ENOMEM;
0083 }
0084 return 0;
0085 }
0086
0087 void __exit
0088 lockd_remove_procfs(void)
0089 {
0090 remove_proc_entry("fs/lockd/nlm_end_grace", NULL);
0091 remove_proc_entry("fs/lockd", NULL);
0092 }