Linux Audio

Check our new training course

Loading...
v6.2
 1// SPDX-License-Identifier: GPL-2.0
 2/*
 3 * Procfs support for lockd
 4 *
 5 * Copyright (c) 2014 Jeff Layton <jlayton@primarydata.com>
 6 */
 7
 8#include <linux/fs.h>
 9#include <linux/proc_fs.h>
10#include <linux/module.h>
11#include <linux/nsproxy.h>
12#include <net/net_namespace.h>
13
14#include "netns.h"
15#include "procfs.h"
16
17/*
18 * We only allow strings that start with 'Y', 'y', or '1'.
19 */
20static ssize_t
21nlm_end_grace_write(struct file *file, const char __user *buf, size_t size,
22		    loff_t *pos)
23{
24	char *data;
25	struct lockd_net *ln = net_generic(current->nsproxy->net_ns,
26					   lockd_net_id);
27
28	if (size < 1)
29		return -EINVAL;
30
31	data = simple_transaction_get(file, buf, size);
32	if (IS_ERR(data))
33		return PTR_ERR(data);
34
35	switch(data[0]) {
36	case 'Y':
37	case 'y':
38	case '1':
39		locks_end_grace(&ln->lockd_manager);
40		break;
41	default:
42		return -EINVAL;
43	}
44
45	return size;
46}
47
48static ssize_t
49nlm_end_grace_read(struct file *file, char __user *buf, size_t size,
50		   loff_t *pos)
51{
52	struct lockd_net *ln = net_generic(current->nsproxy->net_ns,
53					   lockd_net_id);
54	char resp[3];
55
56	resp[0] = list_empty(&ln->lockd_manager.list) ? 'Y' : 'N';
57	resp[1] = '\n';
58	resp[2] = '\0';
59
60	return simple_read_from_buffer(buf, size, pos, resp, sizeof(resp));
61}
62
63static const struct proc_ops lockd_end_grace_proc_ops = {
64	.proc_write	= nlm_end_grace_write,
65	.proc_read	= nlm_end_grace_read,
66	.proc_lseek	= default_llseek,
67	.proc_release	= simple_transaction_release,
68};
69
70int __init
71lockd_create_procfs(void)
72{
73	struct proc_dir_entry *entry;
74
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_proc_ops);
80	if (!entry) {
81		remove_proc_entry("fs/lockd", NULL);
82		return -ENOMEM;
83	}
84	return 0;
85}
86
87void __exit
88lockd_remove_procfs(void)
89{
90	remove_proc_entry("fs/lockd/nlm_end_grace", NULL);
91	remove_proc_entry("fs/lockd", NULL);
92}
v4.10.11
 
 1/*
 2 * Procfs support for lockd
 3 *
 4 * Copyright (c) 2014 Jeff Layton <jlayton@primarydata.com>
 5 */
 6
 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>
12
13#include "netns.h"
14#include "procfs.h"
15
16/*
17 * We only allow strings that start with 'Y', 'y', or '1'.
18 */
19static ssize_t
20nlm_end_grace_write(struct file *file, const char __user *buf, size_t size,
21		    loff_t *pos)
22{
23	char *data;
24	struct lockd_net *ln = net_generic(current->nsproxy->net_ns,
25					   lockd_net_id);
26
27	if (size < 1)
28		return -EINVAL;
29
30	data = simple_transaction_get(file, buf, size);
31	if (IS_ERR(data))
32		return PTR_ERR(data);
33
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;
42	}
43
44	return size;
45}
46
47static ssize_t
48nlm_end_grace_read(struct file *file, char __user *buf, size_t size,
49		   loff_t *pos)
50{
51	struct lockd_net *ln = net_generic(current->nsproxy->net_ns,
52					   lockd_net_id);
53	char resp[3];
54
55	resp[0] = list_empty(&ln->lockd_manager.list) ? 'Y' : 'N';
56	resp[1] = '\n';
57	resp[2] = '\0';
58
59	return simple_read_from_buffer(buf, size, pos, resp, sizeof(resp));
60}
61
62static 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};
68
69int __init
70lockd_create_procfs(void)
71{
72	struct proc_dir_entry *entry;
73
74	entry = proc_mkdir("fs/lockd", NULL);
75	if (!entry)
76		return -ENOMEM;
77	entry = proc_create("nlm_end_grace", S_IRUGO|S_IWUSR, entry,
78				 &lockd_end_grace_operations);
79	if (!entry) {
80		remove_proc_entry("fs/lockd", NULL);
81		return -ENOMEM;
82	}
83	return 0;
84}
85
86void __exit
87lockd_remove_procfs(void)
88{
89	remove_proc_entry("fs/lockd/nlm_end_grace", NULL);
90	remove_proc_entry("fs/lockd", NULL);
91}