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