/** 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_tnlm_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_tnlm_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 __initlockd_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 __exitlockd_remove_procfs(void){remove_proc_entry("fs/lockd/nlm_end_grace", NULL);remove_proc_entry("fs/lockd", NULL);}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。