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