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(struct ctl_table * ctl,int write,void * buffer,size_t * lenp,loff_t * ppos)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
xfs_panic_mask_proc_handler(struct ctl_table * ctl,int write,void * buffer,size_t * lenp,loff_t * ppos)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
533442de9cSPavel Reichl STATIC int
xfs_deprecated_dointvec_minmax(struct ctl_table * ctl,int write,void * buffer,size_t * lenp,loff_t * ppos)5489e0eb8cSDarrick J. Wong xfs_deprecated_dointvec_minmax(
553442de9cSPavel Reichl 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 };
212c59d87c4SChristoph Hellwig
213c59d87c4SChristoph Hellwig int
xfs_sysctl_register(void)214c59d87c4SChristoph Hellwig xfs_sysctl_register(void)
215c59d87c4SChristoph Hellwig {
216*f5d2b92cSLuis Chamberlain xfs_table_header = register_sysctl("fs/xfs", xfs_table);
217c59d87c4SChristoph Hellwig if (!xfs_table_header)
218c59d87c4SChristoph Hellwig return -ENOMEM;
219c59d87c4SChristoph Hellwig return 0;
220c59d87c4SChristoph Hellwig }
221c59d87c4SChristoph Hellwig
222c59d87c4SChristoph Hellwig void
xfs_sysctl_unregister(void)223c59d87c4SChristoph Hellwig xfs_sysctl_unregister(void)
224c59d87c4SChristoph Hellwig {
225c59d87c4SChristoph Hellwig unregister_sysctl_table(xfs_table_header);
226c59d87c4SChristoph Hellwig }
227