xref: /linux/fs/xfs/xfs_sysctl.c (revision 5ff328836dfde0cef9f28c8b8791a90a36d7a183)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2001-2005 Silicon Graphics, Inc.
4  * All Rights Reserved.
5  */
6 #include "xfs.h"
7 #include <linux/sysctl.h>
8 #include <linux/proc_fs.h>
9 #include "xfs_error.h"
10 #include "xfs_stats.h"
11 
12 static struct ctl_table_header *xfs_table_header;
13 
14 #ifdef CONFIG_PROC_FS
15 STATIC int
16 xfs_stats_clear_proc_handler(
17 	struct ctl_table	*ctl,
18 	int			write,
19 	void			__user *buffer,
20 	size_t			*lenp,
21 	loff_t			*ppos)
22 {
23 	int		ret, *valp = ctl->data;
24 
25 	ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
26 
27 	if (!ret && write && *valp) {
28 		xfs_stats_clearall(xfsstats.xs_stats);
29 		xfs_stats_clear = 0;
30 	}
31 
32 	return ret;
33 }
34 
35 STATIC int
36 xfs_panic_mask_proc_handler(
37 	struct ctl_table	*ctl,
38 	int			write,
39 	void			__user *buffer,
40 	size_t			*lenp,
41 	loff_t			*ppos)
42 {
43 	int		ret, *valp = ctl->data;
44 
45 	ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
46 	if (!ret && write) {
47 		xfs_panic_mask = *valp;
48 #ifdef DEBUG
49 		xfs_panic_mask |= (XFS_PTAG_SHUTDOWN_CORRUPT | XFS_PTAG_LOGRES);
50 #endif
51 	}
52 	return ret;
53 }
54 #endif /* CONFIG_PROC_FS */
55 
56 static struct ctl_table xfs_table[] = {
57 	{
58 		.procname	= "irix_sgid_inherit",
59 		.data		= &xfs_params.sgid_inherit.val,
60 		.maxlen		= sizeof(int),
61 		.mode		= 0644,
62 		.proc_handler	= proc_dointvec_minmax,
63 		.extra1		= &xfs_params.sgid_inherit.min,
64 		.extra2		= &xfs_params.sgid_inherit.max
65 	},
66 	{
67 		.procname	= "irix_symlink_mode",
68 		.data		= &xfs_params.symlink_mode.val,
69 		.maxlen		= sizeof(int),
70 		.mode		= 0644,
71 		.proc_handler	= proc_dointvec_minmax,
72 		.extra1		= &xfs_params.symlink_mode.min,
73 		.extra2		= &xfs_params.symlink_mode.max
74 	},
75 	{
76 		.procname	= "panic_mask",
77 		.data		= &xfs_params.panic_mask.val,
78 		.maxlen		= sizeof(int),
79 		.mode		= 0644,
80 		.proc_handler	= xfs_panic_mask_proc_handler,
81 		.extra1		= &xfs_params.panic_mask.min,
82 		.extra2		= &xfs_params.panic_mask.max
83 	},
84 
85 	{
86 		.procname	= "error_level",
87 		.data		= &xfs_params.error_level.val,
88 		.maxlen		= sizeof(int),
89 		.mode		= 0644,
90 		.proc_handler	= proc_dointvec_minmax,
91 		.extra1		= &xfs_params.error_level.min,
92 		.extra2		= &xfs_params.error_level.max
93 	},
94 	{
95 		.procname	= "xfssyncd_centisecs",
96 		.data		= &xfs_params.syncd_timer.val,
97 		.maxlen		= sizeof(int),
98 		.mode		= 0644,
99 		.proc_handler	= proc_dointvec_minmax,
100 		.extra1		= &xfs_params.syncd_timer.min,
101 		.extra2		= &xfs_params.syncd_timer.max
102 	},
103 	{
104 		.procname	= "inherit_sync",
105 		.data		= &xfs_params.inherit_sync.val,
106 		.maxlen		= sizeof(int),
107 		.mode		= 0644,
108 		.proc_handler	= proc_dointvec_minmax,
109 		.extra1		= &xfs_params.inherit_sync.min,
110 		.extra2		= &xfs_params.inherit_sync.max
111 	},
112 	{
113 		.procname	= "inherit_nodump",
114 		.data		= &xfs_params.inherit_nodump.val,
115 		.maxlen		= sizeof(int),
116 		.mode		= 0644,
117 		.proc_handler	= proc_dointvec_minmax,
118 		.extra1		= &xfs_params.inherit_nodump.min,
119 		.extra2		= &xfs_params.inherit_nodump.max
120 	},
121 	{
122 		.procname	= "inherit_noatime",
123 		.data		= &xfs_params.inherit_noatim.val,
124 		.maxlen		= sizeof(int),
125 		.mode		= 0644,
126 		.proc_handler	= proc_dointvec_minmax,
127 		.extra1		= &xfs_params.inherit_noatim.min,
128 		.extra2		= &xfs_params.inherit_noatim.max
129 	},
130 	{
131 		.procname	= "inherit_nosymlinks",
132 		.data		= &xfs_params.inherit_nosym.val,
133 		.maxlen		= sizeof(int),
134 		.mode		= 0644,
135 		.proc_handler	= proc_dointvec_minmax,
136 		.extra1		= &xfs_params.inherit_nosym.min,
137 		.extra2		= &xfs_params.inherit_nosym.max
138 	},
139 	{
140 		.procname	= "rotorstep",
141 		.data		= &xfs_params.rotorstep.val,
142 		.maxlen		= sizeof(int),
143 		.mode		= 0644,
144 		.proc_handler	= proc_dointvec_minmax,
145 		.extra1		= &xfs_params.rotorstep.min,
146 		.extra2		= &xfs_params.rotorstep.max
147 	},
148 	{
149 		.procname	= "inherit_nodefrag",
150 		.data		= &xfs_params.inherit_nodfrg.val,
151 		.maxlen		= sizeof(int),
152 		.mode		= 0644,
153 		.proc_handler	= proc_dointvec_minmax,
154 		.extra1		= &xfs_params.inherit_nodfrg.min,
155 		.extra2		= &xfs_params.inherit_nodfrg.max
156 	},
157 	{
158 		.procname	= "filestream_centisecs",
159 		.data		= &xfs_params.fstrm_timer.val,
160 		.maxlen		= sizeof(int),
161 		.mode		= 0644,
162 		.proc_handler	= proc_dointvec_minmax,
163 		.extra1		= &xfs_params.fstrm_timer.min,
164 		.extra2		= &xfs_params.fstrm_timer.max,
165 	},
166 	{
167 		.procname	= "speculative_prealloc_lifetime",
168 		.data		= &xfs_params.eofb_timer.val,
169 		.maxlen		= sizeof(int),
170 		.mode		= 0644,
171 		.proc_handler	= proc_dointvec_minmax,
172 		.extra1		= &xfs_params.eofb_timer.min,
173 		.extra2		= &xfs_params.eofb_timer.max,
174 	},
175 	{
176 		.procname	= "speculative_cow_prealloc_lifetime",
177 		.data		= &xfs_params.cowb_timer.val,
178 		.maxlen		= sizeof(int),
179 		.mode		= 0644,
180 		.proc_handler	= proc_dointvec_minmax,
181 		.extra1		= &xfs_params.cowb_timer.min,
182 		.extra2		= &xfs_params.cowb_timer.max,
183 	},
184 	/* please keep this the last entry */
185 #ifdef CONFIG_PROC_FS
186 	{
187 		.procname	= "stats_clear",
188 		.data		= &xfs_params.stats_clear.val,
189 		.maxlen		= sizeof(int),
190 		.mode		= 0644,
191 		.proc_handler	= xfs_stats_clear_proc_handler,
192 		.extra1		= &xfs_params.stats_clear.min,
193 		.extra2		= &xfs_params.stats_clear.max
194 	},
195 #endif /* CONFIG_PROC_FS */
196 
197 	{}
198 };
199 
200 static struct ctl_table xfs_dir_table[] = {
201 	{
202 		.procname	= "xfs",
203 		.mode		= 0555,
204 		.child		= xfs_table
205 	},
206 	{}
207 };
208 
209 static struct ctl_table xfs_root_table[] = {
210 	{
211 		.procname	= "fs",
212 		.mode		= 0555,
213 		.child		= xfs_dir_table
214 	},
215 	{}
216 };
217 
218 int
219 xfs_sysctl_register(void)
220 {
221 	xfs_table_header = register_sysctl_table(xfs_root_table);
222 	if (!xfs_table_header)
223 		return -ENOMEM;
224 	return 0;
225 }
226 
227 void
228 xfs_sysctl_unregister(void)
229 {
230 	unregister_sysctl_table(xfs_table_header);
231 }
232