Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Procfs support for lockd
0004  *
0005  * Copyright (c) 2014 Jeff Layton <jlayton@primarydata.com>
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  * We only allow strings that start with 'Y', 'y', or '1'.
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 }