xref: /linux/fs/xfs/xfs_sysctl.c (revision 3442de9cc322500b56a5918139bffcdd62063cc9)
10b61f8a4SDave Chinner // SPDX-License-Identifier: GPL-2.0
2c59d87c4SChristoph Hellwig /*
3c59d87c4SChristoph Hellwig  * Copyright (c) 2001-2005 Silicon Graphics, Inc.
4c59d87c4SChristoph Hellwig  * All Rights Reserved.
5c59d87c4SChristoph Hellwig  */
6c59d87c4SChristoph Hellwig #include "xfs.h"
7c59d87c4SChristoph Hellwig #include "xfs_error.h"
8c59d87c4SChristoph Hellwig 
9c59d87c4SChristoph Hellwig static struct ctl_table_header *xfs_table_header;
10c59d87c4SChristoph Hellwig 
11c59d87c4SChristoph Hellwig #ifdef CONFIG_PROC_FS
12c59d87c4SChristoph Hellwig STATIC int
13c59d87c4SChristoph Hellwig xfs_stats_clear_proc_handler(
14b2410e92SJoe Perches 	struct ctl_table	*ctl,
15c59d87c4SChristoph Hellwig 	int			write,
1632927393SChristoph Hellwig 	void			*buffer,
17c59d87c4SChristoph Hellwig 	size_t			*lenp,
18c59d87c4SChristoph Hellwig 	loff_t			*ppos)
19c59d87c4SChristoph Hellwig {
20bb230c12SBill O'Donnell 	int		ret, *valp = ctl->data;
21c59d87c4SChristoph Hellwig 
22c59d87c4SChristoph Hellwig 	ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
23c59d87c4SChristoph Hellwig 
24c59d87c4SChristoph Hellwig 	if (!ret && write && *valp) {
2580529c45SBill O'Donnell 		xfs_stats_clearall(xfsstats.xs_stats);
26c59d87c4SChristoph Hellwig 		xfs_stats_clear = 0;
27c59d87c4SChristoph Hellwig 	}
28c59d87c4SChristoph Hellwig 
29c59d87c4SChristoph Hellwig 	return ret;
30c59d87c4SChristoph Hellwig }
31c59d87c4SChristoph Hellwig 
32c59d87c4SChristoph Hellwig STATIC int
33c59d87c4SChristoph Hellwig xfs_panic_mask_proc_handler(
34b2410e92SJoe Perches 	struct ctl_table	*ctl,
35c59d87c4SChristoph Hellwig 	int			write,
3632927393SChristoph Hellwig 	void			*buffer,
37c59d87c4SChristoph Hellwig 	size_t			*lenp,
38c59d87c4SChristoph Hellwig 	loff_t			*ppos)
39c59d87c4SChristoph Hellwig {
40c59d87c4SChristoph Hellwig 	int		ret, *valp = ctl->data;
41c59d87c4SChristoph Hellwig 
42c59d87c4SChristoph Hellwig 	ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
43c59d87c4SChristoph Hellwig 	if (!ret && write) {
44c59d87c4SChristoph Hellwig 		xfs_panic_mask = *valp;
45c59d87c4SChristoph Hellwig #ifdef DEBUG
46c59d87c4SChristoph Hellwig 		xfs_panic_mask |= (XFS_PTAG_SHUTDOWN_CORRUPT | XFS_PTAG_LOGRES);
47c59d87c4SChristoph Hellwig #endif
48c59d87c4SChristoph Hellwig 	}
49c59d87c4SChristoph Hellwig 	return ret;
50c59d87c4SChristoph Hellwig }
51c59d87c4SChristoph Hellwig #endif /* CONFIG_PROC_FS */
52c59d87c4SChristoph Hellwig 
53*3442de9cSPavel Reichl STATIC int
54*3442de9cSPavel Reichl xfs_deprecate_irix_sgid_inherit_proc_handler(
55*3442de9cSPavel Reichl 	struct ctl_table	*ctl,
56*3442de9cSPavel Reichl 	int			write,
57*3442de9cSPavel Reichl 	void			*buffer,
58*3442de9cSPavel Reichl 	size_t			*lenp,
59*3442de9cSPavel Reichl 	loff_t			*ppos)
60*3442de9cSPavel Reichl {
61*3442de9cSPavel Reichl 	if (write) {
62*3442de9cSPavel Reichl 		printk_once(KERN_WARNING
63*3442de9cSPavel Reichl 				"XFS: " "%s sysctl option is deprecated.\n",
64*3442de9cSPavel Reichl 				ctl->procname);
65*3442de9cSPavel Reichl 	}
66*3442de9cSPavel Reichl 	return proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
67*3442de9cSPavel Reichl }
68*3442de9cSPavel Reichl 
69*3442de9cSPavel Reichl STATIC int
70*3442de9cSPavel Reichl xfs_deprecate_irix_symlink_mode_proc_handler(
71*3442de9cSPavel Reichl 	struct ctl_table	*ctl,
72*3442de9cSPavel Reichl 	int			write,
73*3442de9cSPavel Reichl 	void			*buffer,
74*3442de9cSPavel Reichl 	size_t			*lenp,
75*3442de9cSPavel Reichl 	loff_t			*ppos)
76*3442de9cSPavel Reichl {
77*3442de9cSPavel Reichl 	if (write) {
78*3442de9cSPavel Reichl 		printk_once(KERN_WARNING
79*3442de9cSPavel Reichl 				"XFS: " "%s sysctl option is deprecated.\n",
80*3442de9cSPavel Reichl 				ctl->procname);
81*3442de9cSPavel Reichl 	}
82*3442de9cSPavel Reichl 	return proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
83*3442de9cSPavel Reichl }
84*3442de9cSPavel Reichl 
85b2410e92SJoe Perches static struct ctl_table xfs_table[] = {
86c59d87c4SChristoph Hellwig 	{
87c59d87c4SChristoph Hellwig 		.procname	= "irix_sgid_inherit",
88c59d87c4SChristoph Hellwig 		.data		= &xfs_params.sgid_inherit.val,
89c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
90c59d87c4SChristoph Hellwig 		.mode		= 0644,
91*3442de9cSPavel Reichl 		.proc_handler	= xfs_deprecate_irix_sgid_inherit_proc_handler,
92c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.sgid_inherit.min,
93c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.sgid_inherit.max
94c59d87c4SChristoph Hellwig 	},
95c59d87c4SChristoph Hellwig 	{
96c59d87c4SChristoph Hellwig 		.procname	= "irix_symlink_mode",
97c59d87c4SChristoph Hellwig 		.data		= &xfs_params.symlink_mode.val,
98c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
99c59d87c4SChristoph Hellwig 		.mode		= 0644,
100*3442de9cSPavel Reichl 		.proc_handler	= xfs_deprecate_irix_symlink_mode_proc_handler,
101c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.symlink_mode.min,
102c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.symlink_mode.max
103c59d87c4SChristoph Hellwig 	},
104c59d87c4SChristoph Hellwig 	{
105c59d87c4SChristoph Hellwig 		.procname	= "panic_mask",
106c59d87c4SChristoph Hellwig 		.data		= &xfs_params.panic_mask.val,
107c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
108c59d87c4SChristoph Hellwig 		.mode		= 0644,
109c59d87c4SChristoph Hellwig 		.proc_handler	= xfs_panic_mask_proc_handler,
110c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.panic_mask.min,
111c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.panic_mask.max
112c59d87c4SChristoph Hellwig 	},
113c59d87c4SChristoph Hellwig 
114c59d87c4SChristoph Hellwig 	{
115c59d87c4SChristoph Hellwig 		.procname	= "error_level",
116c59d87c4SChristoph Hellwig 		.data		= &xfs_params.error_level.val,
117c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
118c59d87c4SChristoph Hellwig 		.mode		= 0644,
119c59d87c4SChristoph Hellwig 		.proc_handler	= proc_dointvec_minmax,
120c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.error_level.min,
121c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.error_level.max
122c59d87c4SChristoph Hellwig 	},
123c59d87c4SChristoph Hellwig 	{
124c59d87c4SChristoph Hellwig 		.procname	= "xfssyncd_centisecs",
125c59d87c4SChristoph Hellwig 		.data		= &xfs_params.syncd_timer.val,
126c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
127c59d87c4SChristoph Hellwig 		.mode		= 0644,
128c59d87c4SChristoph Hellwig 		.proc_handler	= proc_dointvec_minmax,
129c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.syncd_timer.min,
130c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.syncd_timer.max
131c59d87c4SChristoph Hellwig 	},
132c59d87c4SChristoph Hellwig 	{
133c59d87c4SChristoph Hellwig 		.procname	= "inherit_sync",
134c59d87c4SChristoph Hellwig 		.data		= &xfs_params.inherit_sync.val,
135c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
136c59d87c4SChristoph Hellwig 		.mode		= 0644,
137c59d87c4SChristoph Hellwig 		.proc_handler	= proc_dointvec_minmax,
138c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.inherit_sync.min,
139c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.inherit_sync.max
140c59d87c4SChristoph Hellwig 	},
141c59d87c4SChristoph Hellwig 	{
142c59d87c4SChristoph Hellwig 		.procname	= "inherit_nodump",
143c59d87c4SChristoph Hellwig 		.data		= &xfs_params.inherit_nodump.val,
144c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
145c59d87c4SChristoph Hellwig 		.mode		= 0644,
146c59d87c4SChristoph Hellwig 		.proc_handler	= proc_dointvec_minmax,
147c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.inherit_nodump.min,
148c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.inherit_nodump.max
149c59d87c4SChristoph Hellwig 	},
150c59d87c4SChristoph Hellwig 	{
151c59d87c4SChristoph Hellwig 		.procname	= "inherit_noatime",
152c59d87c4SChristoph Hellwig 		.data		= &xfs_params.inherit_noatim.val,
153c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
154c59d87c4SChristoph Hellwig 		.mode		= 0644,
155c59d87c4SChristoph Hellwig 		.proc_handler	= proc_dointvec_minmax,
156c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.inherit_noatim.min,
157c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.inherit_noatim.max
158c59d87c4SChristoph Hellwig 	},
159c59d87c4SChristoph Hellwig 	{
160c59d87c4SChristoph Hellwig 		.procname	= "inherit_nosymlinks",
161c59d87c4SChristoph Hellwig 		.data		= &xfs_params.inherit_nosym.val,
162c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
163c59d87c4SChristoph Hellwig 		.mode		= 0644,
164c59d87c4SChristoph Hellwig 		.proc_handler	= proc_dointvec_minmax,
165c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.inherit_nosym.min,
166c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.inherit_nosym.max
167c59d87c4SChristoph Hellwig 	},
168c59d87c4SChristoph Hellwig 	{
169c59d87c4SChristoph Hellwig 		.procname	= "rotorstep",
170c59d87c4SChristoph Hellwig 		.data		= &xfs_params.rotorstep.val,
171c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
172c59d87c4SChristoph Hellwig 		.mode		= 0644,
173c59d87c4SChristoph Hellwig 		.proc_handler	= proc_dointvec_minmax,
174c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.rotorstep.min,
175c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.rotorstep.max
176c59d87c4SChristoph Hellwig 	},
177c59d87c4SChristoph Hellwig 	{
178c59d87c4SChristoph Hellwig 		.procname	= "inherit_nodefrag",
179c59d87c4SChristoph Hellwig 		.data		= &xfs_params.inherit_nodfrg.val,
180c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
181c59d87c4SChristoph Hellwig 		.mode		= 0644,
182c59d87c4SChristoph Hellwig 		.proc_handler	= proc_dointvec_minmax,
183c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.inherit_nodfrg.min,
184c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.inherit_nodfrg.max
185c59d87c4SChristoph Hellwig 	},
186c59d87c4SChristoph Hellwig 	{
187c59d87c4SChristoph Hellwig 		.procname	= "filestream_centisecs",
188c59d87c4SChristoph Hellwig 		.data		= &xfs_params.fstrm_timer.val,
189c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
190c59d87c4SChristoph Hellwig 		.mode		= 0644,
191c59d87c4SChristoph Hellwig 		.proc_handler	= proc_dointvec_minmax,
192c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.fstrm_timer.min,
193c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.fstrm_timer.max,
194c59d87c4SChristoph Hellwig 	},
195579b62faSBrian Foster 	{
196579b62faSBrian Foster 		.procname	= "speculative_prealloc_lifetime",
197579b62faSBrian Foster 		.data		= &xfs_params.eofb_timer.val,
198579b62faSBrian Foster 		.maxlen		= sizeof(int),
199579b62faSBrian Foster 		.mode		= 0644,
200579b62faSBrian Foster 		.proc_handler	= proc_dointvec_minmax,
201579b62faSBrian Foster 		.extra1		= &xfs_params.eofb_timer.min,
202579b62faSBrian Foster 		.extra2		= &xfs_params.eofb_timer.max,
203579b62faSBrian Foster 	},
20483104d44SDarrick J. Wong 	{
20583104d44SDarrick J. Wong 		.procname	= "speculative_cow_prealloc_lifetime",
20683104d44SDarrick J. Wong 		.data		= &xfs_params.cowb_timer.val,
20783104d44SDarrick J. Wong 		.maxlen		= sizeof(int),
20883104d44SDarrick J. Wong 		.mode		= 0644,
20983104d44SDarrick J. Wong 		.proc_handler	= proc_dointvec_minmax,
21083104d44SDarrick J. Wong 		.extra1		= &xfs_params.cowb_timer.min,
21183104d44SDarrick J. Wong 		.extra2		= &xfs_params.cowb_timer.max,
21283104d44SDarrick J. Wong 	},
213c59d87c4SChristoph Hellwig 	/* please keep this the last entry */
214c59d87c4SChristoph Hellwig #ifdef CONFIG_PROC_FS
215c59d87c4SChristoph Hellwig 	{
216c59d87c4SChristoph Hellwig 		.procname	= "stats_clear",
217c59d87c4SChristoph Hellwig 		.data		= &xfs_params.stats_clear.val,
218c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
219c59d87c4SChristoph Hellwig 		.mode		= 0644,
220c59d87c4SChristoph Hellwig 		.proc_handler	= xfs_stats_clear_proc_handler,
221c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.stats_clear.min,
222c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.stats_clear.max
223c59d87c4SChristoph Hellwig 	},
224c59d87c4SChristoph Hellwig #endif /* CONFIG_PROC_FS */
225c59d87c4SChristoph Hellwig 
226c59d87c4SChristoph Hellwig 	{}
227c59d87c4SChristoph Hellwig };
228c59d87c4SChristoph Hellwig 
229b2410e92SJoe Perches static struct ctl_table xfs_dir_table[] = {
230c59d87c4SChristoph Hellwig 	{
231c59d87c4SChristoph Hellwig 		.procname	= "xfs",
232c59d87c4SChristoph Hellwig 		.mode		= 0555,
233c59d87c4SChristoph Hellwig 		.child		= xfs_table
234c59d87c4SChristoph Hellwig 	},
235c59d87c4SChristoph Hellwig 	{}
236c59d87c4SChristoph Hellwig };
237c59d87c4SChristoph Hellwig 
238b2410e92SJoe Perches static struct ctl_table xfs_root_table[] = {
239c59d87c4SChristoph Hellwig 	{
240c59d87c4SChristoph Hellwig 		.procname	= "fs",
241c59d87c4SChristoph Hellwig 		.mode		= 0555,
242c59d87c4SChristoph Hellwig 		.child		= xfs_dir_table
243c59d87c4SChristoph Hellwig 	},
244c59d87c4SChristoph Hellwig 	{}
245c59d87c4SChristoph Hellwig };
246c59d87c4SChristoph Hellwig 
247c59d87c4SChristoph Hellwig int
248c59d87c4SChristoph Hellwig xfs_sysctl_register(void)
249c59d87c4SChristoph Hellwig {
250c59d87c4SChristoph Hellwig 	xfs_table_header = register_sysctl_table(xfs_root_table);
251c59d87c4SChristoph Hellwig 	if (!xfs_table_header)
252c59d87c4SChristoph Hellwig 		return -ENOMEM;
253c59d87c4SChristoph Hellwig 	return 0;
254c59d87c4SChristoph Hellwig }
255c59d87c4SChristoph Hellwig 
256c59d87c4SChristoph Hellwig void
257c59d87c4SChristoph Hellwig xfs_sysctl_unregister(void)
258c59d87c4SChristoph Hellwig {
259c59d87c4SChristoph Hellwig 	unregister_sysctl_table(xfs_table_header);
260c59d87c4SChristoph Hellwig }
261