162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2001-2005 Silicon Graphics, Inc.
462306a36Sopenharmony_ci * All Rights Reserved.
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci#include "xfs.h"
762306a36Sopenharmony_ci#include "xfs_error.h"
862306a36Sopenharmony_ci
962306a36Sopenharmony_cistatic struct ctl_table_header *xfs_table_header;
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#ifdef CONFIG_PROC_FS
1262306a36Sopenharmony_ciSTATIC int
1362306a36Sopenharmony_cixfs_stats_clear_proc_handler(
1462306a36Sopenharmony_ci	struct ctl_table	*ctl,
1562306a36Sopenharmony_ci	int			write,
1662306a36Sopenharmony_ci	void			*buffer,
1762306a36Sopenharmony_ci	size_t			*lenp,
1862306a36Sopenharmony_ci	loff_t			*ppos)
1962306a36Sopenharmony_ci{
2062306a36Sopenharmony_ci	int		ret, *valp = ctl->data;
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci	if (!ret && write && *valp) {
2562306a36Sopenharmony_ci		xfs_stats_clearall(xfsstats.xs_stats);
2662306a36Sopenharmony_ci		xfs_stats_clear = 0;
2762306a36Sopenharmony_ci	}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	return ret;
3062306a36Sopenharmony_ci}
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ciSTATIC int
3362306a36Sopenharmony_cixfs_panic_mask_proc_handler(
3462306a36Sopenharmony_ci	struct ctl_table	*ctl,
3562306a36Sopenharmony_ci	int			write,
3662306a36Sopenharmony_ci	void			*buffer,
3762306a36Sopenharmony_ci	size_t			*lenp,
3862306a36Sopenharmony_ci	loff_t			*ppos)
3962306a36Sopenharmony_ci{
4062306a36Sopenharmony_ci	int		ret, *valp = ctl->data;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
4362306a36Sopenharmony_ci	if (!ret && write) {
4462306a36Sopenharmony_ci		xfs_panic_mask = *valp;
4562306a36Sopenharmony_ci#ifdef DEBUG
4662306a36Sopenharmony_ci		xfs_panic_mask |= (XFS_PTAG_SHUTDOWN_CORRUPT | XFS_PTAG_LOGRES);
4762306a36Sopenharmony_ci#endif
4862306a36Sopenharmony_ci	}
4962306a36Sopenharmony_ci	return ret;
5062306a36Sopenharmony_ci}
5162306a36Sopenharmony_ci#endif /* CONFIG_PROC_FS */
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ciSTATIC int
5462306a36Sopenharmony_cixfs_deprecated_dointvec_minmax(
5562306a36Sopenharmony_ci	struct ctl_table	*ctl,
5662306a36Sopenharmony_ci	int			write,
5762306a36Sopenharmony_ci	void			*buffer,
5862306a36Sopenharmony_ci	size_t			*lenp,
5962306a36Sopenharmony_ci	loff_t			*ppos)
6062306a36Sopenharmony_ci{
6162306a36Sopenharmony_ci	if (write) {
6262306a36Sopenharmony_ci		printk_ratelimited(KERN_WARNING
6362306a36Sopenharmony_ci				"XFS: %s sysctl option is deprecated.\n",
6462306a36Sopenharmony_ci				ctl->procname);
6562306a36Sopenharmony_ci	}
6662306a36Sopenharmony_ci	return proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
6762306a36Sopenharmony_ci}
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_cistatic struct ctl_table xfs_table[] = {
7062306a36Sopenharmony_ci	{
7162306a36Sopenharmony_ci		.procname	= "irix_sgid_inherit",
7262306a36Sopenharmony_ci		.data		= &xfs_params.sgid_inherit.val,
7362306a36Sopenharmony_ci		.maxlen		= sizeof(int),
7462306a36Sopenharmony_ci		.mode		= 0644,
7562306a36Sopenharmony_ci		.proc_handler	= xfs_deprecated_dointvec_minmax,
7662306a36Sopenharmony_ci		.extra1		= &xfs_params.sgid_inherit.min,
7762306a36Sopenharmony_ci		.extra2		= &xfs_params.sgid_inherit.max
7862306a36Sopenharmony_ci	},
7962306a36Sopenharmony_ci	{
8062306a36Sopenharmony_ci		.procname	= "irix_symlink_mode",
8162306a36Sopenharmony_ci		.data		= &xfs_params.symlink_mode.val,
8262306a36Sopenharmony_ci		.maxlen		= sizeof(int),
8362306a36Sopenharmony_ci		.mode		= 0644,
8462306a36Sopenharmony_ci		.proc_handler	= xfs_deprecated_dointvec_minmax,
8562306a36Sopenharmony_ci		.extra1		= &xfs_params.symlink_mode.min,
8662306a36Sopenharmony_ci		.extra2		= &xfs_params.symlink_mode.max
8762306a36Sopenharmony_ci	},
8862306a36Sopenharmony_ci	{
8962306a36Sopenharmony_ci		.procname	= "panic_mask",
9062306a36Sopenharmony_ci		.data		= &xfs_params.panic_mask.val,
9162306a36Sopenharmony_ci		.maxlen		= sizeof(int),
9262306a36Sopenharmony_ci		.mode		= 0644,
9362306a36Sopenharmony_ci		.proc_handler	= xfs_panic_mask_proc_handler,
9462306a36Sopenharmony_ci		.extra1		= &xfs_params.panic_mask.min,
9562306a36Sopenharmony_ci		.extra2		= &xfs_params.panic_mask.max
9662306a36Sopenharmony_ci	},
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	{
9962306a36Sopenharmony_ci		.procname	= "error_level",
10062306a36Sopenharmony_ci		.data		= &xfs_params.error_level.val,
10162306a36Sopenharmony_ci		.maxlen		= sizeof(int),
10262306a36Sopenharmony_ci		.mode		= 0644,
10362306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
10462306a36Sopenharmony_ci		.extra1		= &xfs_params.error_level.min,
10562306a36Sopenharmony_ci		.extra2		= &xfs_params.error_level.max
10662306a36Sopenharmony_ci	},
10762306a36Sopenharmony_ci	{
10862306a36Sopenharmony_ci		.procname	= "xfssyncd_centisecs",
10962306a36Sopenharmony_ci		.data		= &xfs_params.syncd_timer.val,
11062306a36Sopenharmony_ci		.maxlen		= sizeof(int),
11162306a36Sopenharmony_ci		.mode		= 0644,
11262306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
11362306a36Sopenharmony_ci		.extra1		= &xfs_params.syncd_timer.min,
11462306a36Sopenharmony_ci		.extra2		= &xfs_params.syncd_timer.max
11562306a36Sopenharmony_ci	},
11662306a36Sopenharmony_ci	{
11762306a36Sopenharmony_ci		.procname	= "inherit_sync",
11862306a36Sopenharmony_ci		.data		= &xfs_params.inherit_sync.val,
11962306a36Sopenharmony_ci		.maxlen		= sizeof(int),
12062306a36Sopenharmony_ci		.mode		= 0644,
12162306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
12262306a36Sopenharmony_ci		.extra1		= &xfs_params.inherit_sync.min,
12362306a36Sopenharmony_ci		.extra2		= &xfs_params.inherit_sync.max
12462306a36Sopenharmony_ci	},
12562306a36Sopenharmony_ci	{
12662306a36Sopenharmony_ci		.procname	= "inherit_nodump",
12762306a36Sopenharmony_ci		.data		= &xfs_params.inherit_nodump.val,
12862306a36Sopenharmony_ci		.maxlen		= sizeof(int),
12962306a36Sopenharmony_ci		.mode		= 0644,
13062306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
13162306a36Sopenharmony_ci		.extra1		= &xfs_params.inherit_nodump.min,
13262306a36Sopenharmony_ci		.extra2		= &xfs_params.inherit_nodump.max
13362306a36Sopenharmony_ci	},
13462306a36Sopenharmony_ci	{
13562306a36Sopenharmony_ci		.procname	= "inherit_noatime",
13662306a36Sopenharmony_ci		.data		= &xfs_params.inherit_noatim.val,
13762306a36Sopenharmony_ci		.maxlen		= sizeof(int),
13862306a36Sopenharmony_ci		.mode		= 0644,
13962306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
14062306a36Sopenharmony_ci		.extra1		= &xfs_params.inherit_noatim.min,
14162306a36Sopenharmony_ci		.extra2		= &xfs_params.inherit_noatim.max
14262306a36Sopenharmony_ci	},
14362306a36Sopenharmony_ci	{
14462306a36Sopenharmony_ci		.procname	= "inherit_nosymlinks",
14562306a36Sopenharmony_ci		.data		= &xfs_params.inherit_nosym.val,
14662306a36Sopenharmony_ci		.maxlen		= sizeof(int),
14762306a36Sopenharmony_ci		.mode		= 0644,
14862306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
14962306a36Sopenharmony_ci		.extra1		= &xfs_params.inherit_nosym.min,
15062306a36Sopenharmony_ci		.extra2		= &xfs_params.inherit_nosym.max
15162306a36Sopenharmony_ci	},
15262306a36Sopenharmony_ci	{
15362306a36Sopenharmony_ci		.procname	= "rotorstep",
15462306a36Sopenharmony_ci		.data		= &xfs_params.rotorstep.val,
15562306a36Sopenharmony_ci		.maxlen		= sizeof(int),
15662306a36Sopenharmony_ci		.mode		= 0644,
15762306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
15862306a36Sopenharmony_ci		.extra1		= &xfs_params.rotorstep.min,
15962306a36Sopenharmony_ci		.extra2		= &xfs_params.rotorstep.max
16062306a36Sopenharmony_ci	},
16162306a36Sopenharmony_ci	{
16262306a36Sopenharmony_ci		.procname	= "inherit_nodefrag",
16362306a36Sopenharmony_ci		.data		= &xfs_params.inherit_nodfrg.val,
16462306a36Sopenharmony_ci		.maxlen		= sizeof(int),
16562306a36Sopenharmony_ci		.mode		= 0644,
16662306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
16762306a36Sopenharmony_ci		.extra1		= &xfs_params.inherit_nodfrg.min,
16862306a36Sopenharmony_ci		.extra2		= &xfs_params.inherit_nodfrg.max
16962306a36Sopenharmony_ci	},
17062306a36Sopenharmony_ci	{
17162306a36Sopenharmony_ci		.procname	= "filestream_centisecs",
17262306a36Sopenharmony_ci		.data		= &xfs_params.fstrm_timer.val,
17362306a36Sopenharmony_ci		.maxlen		= sizeof(int),
17462306a36Sopenharmony_ci		.mode		= 0644,
17562306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
17662306a36Sopenharmony_ci		.extra1		= &xfs_params.fstrm_timer.min,
17762306a36Sopenharmony_ci		.extra2		= &xfs_params.fstrm_timer.max,
17862306a36Sopenharmony_ci	},
17962306a36Sopenharmony_ci	{
18062306a36Sopenharmony_ci		.procname	= "speculative_prealloc_lifetime",
18162306a36Sopenharmony_ci		.data		= &xfs_params.blockgc_timer.val,
18262306a36Sopenharmony_ci		.maxlen		= sizeof(int),
18362306a36Sopenharmony_ci		.mode		= 0644,
18462306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
18562306a36Sopenharmony_ci		.extra1		= &xfs_params.blockgc_timer.min,
18662306a36Sopenharmony_ci		.extra2		= &xfs_params.blockgc_timer.max,
18762306a36Sopenharmony_ci	},
18862306a36Sopenharmony_ci	{
18962306a36Sopenharmony_ci		.procname	= "speculative_cow_prealloc_lifetime",
19062306a36Sopenharmony_ci		.data		= &xfs_params.blockgc_timer.val,
19162306a36Sopenharmony_ci		.maxlen		= sizeof(int),
19262306a36Sopenharmony_ci		.mode		= 0644,
19362306a36Sopenharmony_ci		.proc_handler	= xfs_deprecated_dointvec_minmax,
19462306a36Sopenharmony_ci		.extra1		= &xfs_params.blockgc_timer.min,
19562306a36Sopenharmony_ci		.extra2		= &xfs_params.blockgc_timer.max,
19662306a36Sopenharmony_ci	},
19762306a36Sopenharmony_ci	/* please keep this the last entry */
19862306a36Sopenharmony_ci#ifdef CONFIG_PROC_FS
19962306a36Sopenharmony_ci	{
20062306a36Sopenharmony_ci		.procname	= "stats_clear",
20162306a36Sopenharmony_ci		.data		= &xfs_params.stats_clear.val,
20262306a36Sopenharmony_ci		.maxlen		= sizeof(int),
20362306a36Sopenharmony_ci		.mode		= 0644,
20462306a36Sopenharmony_ci		.proc_handler	= xfs_stats_clear_proc_handler,
20562306a36Sopenharmony_ci		.extra1		= &xfs_params.stats_clear.min,
20662306a36Sopenharmony_ci		.extra2		= &xfs_params.stats_clear.max
20762306a36Sopenharmony_ci	},
20862306a36Sopenharmony_ci#endif /* CONFIG_PROC_FS */
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci	{}
21162306a36Sopenharmony_ci};
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ciint
21462306a36Sopenharmony_cixfs_sysctl_register(void)
21562306a36Sopenharmony_ci{
21662306a36Sopenharmony_ci	xfs_table_header = register_sysctl("fs/xfs", xfs_table);
21762306a36Sopenharmony_ci	if (!xfs_table_header)
21862306a36Sopenharmony_ci		return -ENOMEM;
21962306a36Sopenharmony_ci	return 0;
22062306a36Sopenharmony_ci}
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_civoid
22362306a36Sopenharmony_cixfs_sysctl_unregister(void)
22462306a36Sopenharmony_ci{
22562306a36Sopenharmony_ci	unregister_sysctl_table(xfs_table_header);
22662306a36Sopenharmony_ci}
227