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