xref: /kernel/linux/linux-6.6/fs/xfs/xfs_sysctl.c (revision 62306a36)
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
9static struct ctl_table_header *xfs_table_header;
10
11#ifdef CONFIG_PROC_FS
12STATIC int
13xfs_stats_clear_proc_handler(
14	struct ctl_table	*ctl,
15	int			write,
16	void			*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
32STATIC int
33xfs_panic_mask_proc_handler(
34	struct ctl_table	*ctl,
35	int			write,
36	void			*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
53STATIC int
54xfs_deprecated_dointvec_minmax(
55	struct ctl_table	*ctl,
56	int			write,
57	void			*buffer,
58	size_t			*lenp,
59	loff_t			*ppos)
60{
61	if (write) {
62		printk_ratelimited(KERN_WARNING
63				"XFS: %s sysctl option is deprecated.\n",
64				ctl->procname);
65	}
66	return proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
67}
68
69static struct ctl_table xfs_table[] = {
70	{
71		.procname	= "irix_sgid_inherit",
72		.data		= &xfs_params.sgid_inherit.val,
73		.maxlen		= sizeof(int),
74		.mode		= 0644,
75		.proc_handler	= xfs_deprecated_dointvec_minmax,
76		.extra1		= &xfs_params.sgid_inherit.min,
77		.extra2		= &xfs_params.sgid_inherit.max
78	},
79	{
80		.procname	= "irix_symlink_mode",
81		.data		= &xfs_params.symlink_mode.val,
82		.maxlen		= sizeof(int),
83		.mode		= 0644,
84		.proc_handler	= xfs_deprecated_dointvec_minmax,
85		.extra1		= &xfs_params.symlink_mode.min,
86		.extra2		= &xfs_params.symlink_mode.max
87	},
88	{
89		.procname	= "panic_mask",
90		.data		= &xfs_params.panic_mask.val,
91		.maxlen		= sizeof(int),
92		.mode		= 0644,
93		.proc_handler	= xfs_panic_mask_proc_handler,
94		.extra1		= &xfs_params.panic_mask.min,
95		.extra2		= &xfs_params.panic_mask.max
96	},
97
98	{
99		.procname	= "error_level",
100		.data		= &xfs_params.error_level.val,
101		.maxlen		= sizeof(int),
102		.mode		= 0644,
103		.proc_handler	= proc_dointvec_minmax,
104		.extra1		= &xfs_params.error_level.min,
105		.extra2		= &xfs_params.error_level.max
106	},
107	{
108		.procname	= "xfssyncd_centisecs",
109		.data		= &xfs_params.syncd_timer.val,
110		.maxlen		= sizeof(int),
111		.mode		= 0644,
112		.proc_handler	= proc_dointvec_minmax,
113		.extra1		= &xfs_params.syncd_timer.min,
114		.extra2		= &xfs_params.syncd_timer.max
115	},
116	{
117		.procname	= "inherit_sync",
118		.data		= &xfs_params.inherit_sync.val,
119		.maxlen		= sizeof(int),
120		.mode		= 0644,
121		.proc_handler	= proc_dointvec_minmax,
122		.extra1		= &xfs_params.inherit_sync.min,
123		.extra2		= &xfs_params.inherit_sync.max
124	},
125	{
126		.procname	= "inherit_nodump",
127		.data		= &xfs_params.inherit_nodump.val,
128		.maxlen		= sizeof(int),
129		.mode		= 0644,
130		.proc_handler	= proc_dointvec_minmax,
131		.extra1		= &xfs_params.inherit_nodump.min,
132		.extra2		= &xfs_params.inherit_nodump.max
133	},
134	{
135		.procname	= "inherit_noatime",
136		.data		= &xfs_params.inherit_noatim.val,
137		.maxlen		= sizeof(int),
138		.mode		= 0644,
139		.proc_handler	= proc_dointvec_minmax,
140		.extra1		= &xfs_params.inherit_noatim.min,
141		.extra2		= &xfs_params.inherit_noatim.max
142	},
143	{
144		.procname	= "inherit_nosymlinks",
145		.data		= &xfs_params.inherit_nosym.val,
146		.maxlen		= sizeof(int),
147		.mode		= 0644,
148		.proc_handler	= proc_dointvec_minmax,
149		.extra1		= &xfs_params.inherit_nosym.min,
150		.extra2		= &xfs_params.inherit_nosym.max
151	},
152	{
153		.procname	= "rotorstep",
154		.data		= &xfs_params.rotorstep.val,
155		.maxlen		= sizeof(int),
156		.mode		= 0644,
157		.proc_handler	= proc_dointvec_minmax,
158		.extra1		= &xfs_params.rotorstep.min,
159		.extra2		= &xfs_params.rotorstep.max
160	},
161	{
162		.procname	= "inherit_nodefrag",
163		.data		= &xfs_params.inherit_nodfrg.val,
164		.maxlen		= sizeof(int),
165		.mode		= 0644,
166		.proc_handler	= proc_dointvec_minmax,
167		.extra1		= &xfs_params.inherit_nodfrg.min,
168		.extra2		= &xfs_params.inherit_nodfrg.max
169	},
170	{
171		.procname	= "filestream_centisecs",
172		.data		= &xfs_params.fstrm_timer.val,
173		.maxlen		= sizeof(int),
174		.mode		= 0644,
175		.proc_handler	= proc_dointvec_minmax,
176		.extra1		= &xfs_params.fstrm_timer.min,
177		.extra2		= &xfs_params.fstrm_timer.max,
178	},
179	{
180		.procname	= "speculative_prealloc_lifetime",
181		.data		= &xfs_params.blockgc_timer.val,
182		.maxlen		= sizeof(int),
183		.mode		= 0644,
184		.proc_handler	= proc_dointvec_minmax,
185		.extra1		= &xfs_params.blockgc_timer.min,
186		.extra2		= &xfs_params.blockgc_timer.max,
187	},
188	{
189		.procname	= "speculative_cow_prealloc_lifetime",
190		.data		= &xfs_params.blockgc_timer.val,
191		.maxlen		= sizeof(int),
192		.mode		= 0644,
193		.proc_handler	= xfs_deprecated_dointvec_minmax,
194		.extra1		= &xfs_params.blockgc_timer.min,
195		.extra2		= &xfs_params.blockgc_timer.max,
196	},
197	/* please keep this the last entry */
198#ifdef CONFIG_PROC_FS
199	{
200		.procname	= "stats_clear",
201		.data		= &xfs_params.stats_clear.val,
202		.maxlen		= sizeof(int),
203		.mode		= 0644,
204		.proc_handler	= xfs_stats_clear_proc_handler,
205		.extra1		= &xfs_params.stats_clear.min,
206		.extra2		= &xfs_params.stats_clear.max
207	},
208#endif /* CONFIG_PROC_FS */
209
210	{}
211};
212
213int
214xfs_sysctl_register(void)
215{
216	xfs_table_header = register_sysctl("fs/xfs", xfs_table);
217	if (!xfs_table_header)
218		return -ENOMEM;
219	return 0;
220}
221
222void
223xfs_sysctl_unregister(void)
224{
225	unregister_sysctl_table(xfs_table_header);
226}
227