123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- /*
- * Procfs support for lockd
- *
- * Copyright (c) 2014 Jeff Layton <jlayton@primarydata.com>
- */
- #include <linux/fs.h>
- #include <linux/proc_fs.h>
- #include <linux/module.h>
- #include <linux/nsproxy.h>
- #include <net/net_namespace.h>
- #include "netns.h"
- #include "procfs.h"
- /*
- * We only allow strings that start with 'Y', 'y', or '1'.
- */
- static ssize_t
- nlm_end_grace_write(struct file *file, const char __user *buf, size_t size,
- loff_t *pos)
- {
- char *data;
- struct lockd_net *ln = net_generic(current->nsproxy->net_ns,
- lockd_net_id);
- if (size < 1)
- return -EINVAL;
- data = simple_transaction_get(file, buf, size);
- if (IS_ERR(data))
- return PTR_ERR(data);
- switch(data[0]) {
- case 'Y':
- case 'y':
- case '1':
- locks_end_grace(&ln->lockd_manager);
- break;
- default:
- return -EINVAL;
- }
- return size;
- }
- static ssize_t
- nlm_end_grace_read(struct file *file, char __user *buf, size_t size,
- loff_t *pos)
- {
- struct lockd_net *ln = net_generic(current->nsproxy->net_ns,
- lockd_net_id);
- char resp[3];
- resp[0] = list_empty(&ln->lockd_manager.list) ? 'Y' : 'N';
- resp[1] = '\n';
- resp[2] = '\0';
- return simple_read_from_buffer(buf, size, pos, resp, sizeof(resp));
- }
- static const struct file_operations lockd_end_grace_operations = {
- .write = nlm_end_grace_write,
- .read = nlm_end_grace_read,
- .llseek = default_llseek,
- .release = simple_transaction_release,
- .owner = THIS_MODULE,
- };
- int __init
- lockd_create_procfs(void)
- {
- struct proc_dir_entry *entry;
- entry = proc_mkdir("fs/lockd", NULL);
- if (!entry)
- return -ENOMEM;
- entry = proc_create("nlm_end_grace", S_IRUGO|S_IWUSR, entry,
- &lockd_end_grace_operations);
- if (!entry) {
- remove_proc_entry("fs/lockd", NULL);
- return -ENOMEM;
- }
- return 0;
- }
- void __exit
- lockd_remove_procfs(void)
- {
- remove_proc_entry("fs/lockd/nlm_end_grace", NULL);
- remove_proc_entry("fs/lockd", NULL);
- }
|