xref: /linux/fs/xfs/xfs_sysctl.c (revision a1ff5a7d78a036d6c2178ee5acd6ba4946243800)
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
xfs_stats_clear_proc_handler(const struct ctl_table * ctl,int write,void * buffer,size_t * lenp,loff_t * ppos)13c59d87c4SChristoph Hellwig xfs_stats_clear_proc_handler(
14*78eb4ea2SJoel Granados 	const 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
xfs_panic_mask_proc_handler(const struct ctl_table * ctl,int write,void * buffer,size_t * lenp,loff_t * ppos)33c59d87c4SChristoph Hellwig xfs_panic_mask_proc_handler(
34*78eb4ea2SJoel Granados 	const 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 
533442de9cSPavel Reichl STATIC int
xfs_deprecated_dointvec_minmax(const struct ctl_table * ctl,int write,void * buffer,size_t * lenp,loff_t * ppos)5489e0eb8cSDarrick J. Wong xfs_deprecated_dointvec_minmax(
55*78eb4ea2SJoel Granados 	const struct ctl_table	*ctl,
563442de9cSPavel Reichl 	int			write,
573442de9cSPavel Reichl 	void			*buffer,
583442de9cSPavel Reichl 	size_t			*lenp,
593442de9cSPavel Reichl 	loff_t			*ppos)
603442de9cSPavel Reichl {
613442de9cSPavel Reichl 	if (write) {
6289e0eb8cSDarrick J. Wong 		printk_ratelimited(KERN_WARNING
6389e0eb8cSDarrick J. Wong 				"XFS: %s sysctl option is deprecated.\n",
643442de9cSPavel Reichl 				ctl->procname);
653442de9cSPavel Reichl 	}
663442de9cSPavel Reichl 	return proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
673442de9cSPavel Reichl }
683442de9cSPavel Reichl 
69b2410e92SJoe Perches static struct ctl_table xfs_table[] = {
70c59d87c4SChristoph Hellwig 	{
71c59d87c4SChristoph Hellwig 		.procname	= "irix_sgid_inherit",
72c59d87c4SChristoph Hellwig 		.data		= &xfs_params.sgid_inherit.val,
73c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
74c59d87c4SChristoph Hellwig 		.mode		= 0644,
7589e0eb8cSDarrick J. Wong 		.proc_handler	= xfs_deprecated_dointvec_minmax,
76c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.sgid_inherit.min,
77c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.sgid_inherit.max
78c59d87c4SChristoph Hellwig 	},
79c59d87c4SChristoph Hellwig 	{
80c59d87c4SChristoph Hellwig 		.procname	= "irix_symlink_mode",
81c59d87c4SChristoph Hellwig 		.data		= &xfs_params.symlink_mode.val,
82c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
83c59d87c4SChristoph Hellwig 		.mode		= 0644,
8489e0eb8cSDarrick J. Wong 		.proc_handler	= xfs_deprecated_dointvec_minmax,
85c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.symlink_mode.min,
86c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.symlink_mode.max
87c59d87c4SChristoph Hellwig 	},
88c59d87c4SChristoph Hellwig 	{
89c59d87c4SChristoph Hellwig 		.procname	= "panic_mask",
90c59d87c4SChristoph Hellwig 		.data		= &xfs_params.panic_mask.val,
91c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
92c59d87c4SChristoph Hellwig 		.mode		= 0644,
93c59d87c4SChristoph Hellwig 		.proc_handler	= xfs_panic_mask_proc_handler,
94c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.panic_mask.min,
95c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.panic_mask.max
96c59d87c4SChristoph Hellwig 	},
97c59d87c4SChristoph Hellwig 
98c59d87c4SChristoph Hellwig 	{
99c59d87c4SChristoph Hellwig 		.procname	= "error_level",
100c59d87c4SChristoph Hellwig 		.data		= &xfs_params.error_level.val,
101c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
102c59d87c4SChristoph Hellwig 		.mode		= 0644,
103c59d87c4SChristoph Hellwig 		.proc_handler	= proc_dointvec_minmax,
104c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.error_level.min,
105c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.error_level.max
106c59d87c4SChristoph Hellwig 	},
107c59d87c4SChristoph Hellwig 	{
108c59d87c4SChristoph Hellwig 		.procname	= "xfssyncd_centisecs",
109c59d87c4SChristoph Hellwig 		.data		= &xfs_params.syncd_timer.val,
110c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
111c59d87c4SChristoph Hellwig 		.mode		= 0644,
112c59d87c4SChristoph Hellwig 		.proc_handler	= proc_dointvec_minmax,
113c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.syncd_timer.min,
114c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.syncd_timer.max
115c59d87c4SChristoph Hellwig 	},
116c59d87c4SChristoph Hellwig 	{
117c59d87c4SChristoph Hellwig 		.procname	= "inherit_sync",
118c59d87c4SChristoph Hellwig 		.data		= &xfs_params.inherit_sync.val,
119c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
120c59d87c4SChristoph Hellwig 		.mode		= 0644,
121c59d87c4SChristoph Hellwig 		.proc_handler	= proc_dointvec_minmax,
122c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.inherit_sync.min,
123c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.inherit_sync.max
124c59d87c4SChristoph Hellwig 	},
125c59d87c4SChristoph Hellwig 	{
126c59d87c4SChristoph Hellwig 		.procname	= "inherit_nodump",
127c59d87c4SChristoph Hellwig 		.data		= &xfs_params.inherit_nodump.val,
128c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
129c59d87c4SChristoph Hellwig 		.mode		= 0644,
130c59d87c4SChristoph Hellwig 		.proc_handler	= proc_dointvec_minmax,
131c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.inherit_nodump.min,
132c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.inherit_nodump.max
133c59d87c4SChristoph Hellwig 	},
134c59d87c4SChristoph Hellwig 	{
135c59d87c4SChristoph Hellwig 		.procname	= "inherit_noatime",
136c59d87c4SChristoph Hellwig 		.data		= &xfs_params.inherit_noatim.val,
137c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
138c59d87c4SChristoph Hellwig 		.mode		= 0644,
139c59d87c4SChristoph Hellwig 		.proc_handler	= proc_dointvec_minmax,
140c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.inherit_noatim.min,
141c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.inherit_noatim.max
142c59d87c4SChristoph Hellwig 	},
143c59d87c4SChristoph Hellwig 	{
144c59d87c4SChristoph Hellwig 		.procname	= "inherit_nosymlinks",
145c59d87c4SChristoph Hellwig 		.data		= &xfs_params.inherit_nosym.val,
146c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
147c59d87c4SChristoph Hellwig 		.mode		= 0644,
148c59d87c4SChristoph Hellwig 		.proc_handler	= proc_dointvec_minmax,
149c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.inherit_nosym.min,
150c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.inherit_nosym.max
151c59d87c4SChristoph Hellwig 	},
152c59d87c4SChristoph Hellwig 	{
153c59d87c4SChristoph Hellwig 		.procname	= "rotorstep",
154c59d87c4SChristoph Hellwig 		.data		= &xfs_params.rotorstep.val,
155c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
156c59d87c4SChristoph Hellwig 		.mode		= 0644,
157c59d87c4SChristoph Hellwig 		.proc_handler	= proc_dointvec_minmax,
158c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.rotorstep.min,
159c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.rotorstep.max
160c59d87c4SChristoph Hellwig 	},
161c59d87c4SChristoph Hellwig 	{
162c59d87c4SChristoph Hellwig 		.procname	= "inherit_nodefrag",
163c59d87c4SChristoph Hellwig 		.data		= &xfs_params.inherit_nodfrg.val,
164c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
165c59d87c4SChristoph Hellwig 		.mode		= 0644,
166c59d87c4SChristoph Hellwig 		.proc_handler	= proc_dointvec_minmax,
167c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.inherit_nodfrg.min,
168c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.inherit_nodfrg.max
169c59d87c4SChristoph Hellwig 	},
170c59d87c4SChristoph Hellwig 	{
171c59d87c4SChristoph Hellwig 		.procname	= "filestream_centisecs",
172c59d87c4SChristoph Hellwig 		.data		= &xfs_params.fstrm_timer.val,
173c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
174c59d87c4SChristoph Hellwig 		.mode		= 0644,
175c59d87c4SChristoph Hellwig 		.proc_handler	= proc_dointvec_minmax,
176c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.fstrm_timer.min,
177c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.fstrm_timer.max,
178c59d87c4SChristoph Hellwig 	},
179579b62faSBrian Foster 	{
180579b62faSBrian Foster 		.procname	= "speculative_prealloc_lifetime",
1819669f51dSDarrick J. Wong 		.data		= &xfs_params.blockgc_timer.val,
182579b62faSBrian Foster 		.maxlen		= sizeof(int),
183579b62faSBrian Foster 		.mode		= 0644,
184579b62faSBrian Foster 		.proc_handler	= proc_dointvec_minmax,
1859669f51dSDarrick J. Wong 		.extra1		= &xfs_params.blockgc_timer.min,
1869669f51dSDarrick J. Wong 		.extra2		= &xfs_params.blockgc_timer.max,
18783104d44SDarrick J. Wong 	},
18889e0eb8cSDarrick J. Wong 	{
18989e0eb8cSDarrick J. Wong 		.procname	= "speculative_cow_prealloc_lifetime",
19089e0eb8cSDarrick J. Wong 		.data		= &xfs_params.blockgc_timer.val,
19189e0eb8cSDarrick J. Wong 		.maxlen		= sizeof(int),
19289e0eb8cSDarrick J. Wong 		.mode		= 0644,
19389e0eb8cSDarrick J. Wong 		.proc_handler	= xfs_deprecated_dointvec_minmax,
19489e0eb8cSDarrick J. Wong 		.extra1		= &xfs_params.blockgc_timer.min,
19589e0eb8cSDarrick J. Wong 		.extra2		= &xfs_params.blockgc_timer.max,
19689e0eb8cSDarrick J. Wong 	},
197c59d87c4SChristoph Hellwig 	/* please keep this the last entry */
198c59d87c4SChristoph Hellwig #ifdef CONFIG_PROC_FS
199c59d87c4SChristoph Hellwig 	{
200c59d87c4SChristoph Hellwig 		.procname	= "stats_clear",
201c59d87c4SChristoph Hellwig 		.data		= &xfs_params.stats_clear.val,
202c59d87c4SChristoph Hellwig 		.maxlen		= sizeof(int),
203c59d87c4SChristoph Hellwig 		.mode		= 0644,
204c59d87c4SChristoph Hellwig 		.proc_handler	= xfs_stats_clear_proc_handler,
205c59d87c4SChristoph Hellwig 		.extra1		= &xfs_params.stats_clear.min,
206c59d87c4SChristoph Hellwig 		.extra2		= &xfs_params.stats_clear.max
207c59d87c4SChristoph Hellwig 	},
208c59d87c4SChristoph Hellwig #endif /* CONFIG_PROC_FS */
209c59d87c4SChristoph Hellwig };
210c59d87c4SChristoph Hellwig 
211c59d87c4SChristoph Hellwig int
xfs_sysctl_register(void)212c59d87c4SChristoph Hellwig xfs_sysctl_register(void)
213c59d87c4SChristoph Hellwig {
214f5d2b92cSLuis Chamberlain 	xfs_table_header = register_sysctl("fs/xfs", xfs_table);
215c59d87c4SChristoph Hellwig 	if (!xfs_table_header)
216c59d87c4SChristoph Hellwig 		return -ENOMEM;
217c59d87c4SChristoph Hellwig 	return 0;
218c59d87c4SChristoph Hellwig }
219c59d87c4SChristoph Hellwig 
220c59d87c4SChristoph Hellwig void
xfs_sysctl_unregister(void)221c59d87c4SChristoph Hellwig xfs_sysctl_unregister(void)
222c59d87c4SChristoph Hellwig {
223c59d87c4SChristoph Hellwig 	unregister_sysctl_table(xfs_table_header);
224c59d87c4SChristoph Hellwig }
225