Merge tag 'for-linus-4.4-rc5-tag' of git://git.kernel.org/pub/scm/linux/kernel/git...
[firefly-linux-kernel-4.4.55.git] / fs / xfs / xfs_sysctl.c
1 /*
2  * Copyright (c) 2001-2005 Silicon Graphics, Inc.
3  * All Rights Reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it would be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write the Free Software Foundation,
16  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18 #include "xfs.h"
19 #include <linux/sysctl.h>
20 #include <linux/proc_fs.h>
21 #include "xfs_error.h"
22 #include "xfs_stats.h"
23
24 static struct ctl_table_header *xfs_table_header;
25
26 #ifdef CONFIG_PROC_FS
27 STATIC int
28 xfs_stats_clear_proc_handler(
29         struct ctl_table        *ctl,
30         int                     write,
31         void                    __user *buffer,
32         size_t                  *lenp,
33         loff_t                  *ppos)
34 {
35         int             ret, *valp = ctl->data;
36
37         ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
38
39         if (!ret && write && *valp) {
40                 xfs_stats_clearall(xfsstats.xs_stats);
41                 xfs_stats_clear = 0;
42         }
43
44         return ret;
45 }
46
47 STATIC int
48 xfs_panic_mask_proc_handler(
49         struct ctl_table        *ctl,
50         int                     write,
51         void                    __user *buffer,
52         size_t                  *lenp,
53         loff_t                  *ppos)
54 {
55         int             ret, *valp = ctl->data;
56
57         ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
58         if (!ret && write) {
59                 xfs_panic_mask = *valp;
60 #ifdef DEBUG
61                 xfs_panic_mask |= (XFS_PTAG_SHUTDOWN_CORRUPT | XFS_PTAG_LOGRES);
62 #endif
63         }
64         return ret;
65 }
66 #endif /* CONFIG_PROC_FS */
67
68 static struct ctl_table xfs_table[] = {
69         {
70                 .procname       = "irix_sgid_inherit",
71                 .data           = &xfs_params.sgid_inherit.val,
72                 .maxlen         = sizeof(int),
73                 .mode           = 0644,
74                 .proc_handler   = proc_dointvec_minmax,
75                 .extra1         = &xfs_params.sgid_inherit.min,
76                 .extra2         = &xfs_params.sgid_inherit.max
77         },
78         {
79                 .procname       = "irix_symlink_mode",
80                 .data           = &xfs_params.symlink_mode.val,
81                 .maxlen         = sizeof(int),
82                 .mode           = 0644,
83                 .proc_handler   = proc_dointvec_minmax,
84                 .extra1         = &xfs_params.symlink_mode.min,
85                 .extra2         = &xfs_params.symlink_mode.max
86         },
87         {
88                 .procname       = "panic_mask",
89                 .data           = &xfs_params.panic_mask.val,
90                 .maxlen         = sizeof(int),
91                 .mode           = 0644,
92                 .proc_handler   = xfs_panic_mask_proc_handler,
93                 .extra1         = &xfs_params.panic_mask.min,
94                 .extra2         = &xfs_params.panic_mask.max
95         },
96
97         {
98                 .procname       = "error_level",
99                 .data           = &xfs_params.error_level.val,
100                 .maxlen         = sizeof(int),
101                 .mode           = 0644,
102                 .proc_handler   = proc_dointvec_minmax,
103                 .extra1         = &xfs_params.error_level.min,
104                 .extra2         = &xfs_params.error_level.max
105         },
106         {
107                 .procname       = "xfssyncd_centisecs",
108                 .data           = &xfs_params.syncd_timer.val,
109                 .maxlen         = sizeof(int),
110                 .mode           = 0644,
111                 .proc_handler   = proc_dointvec_minmax,
112                 .extra1         = &xfs_params.syncd_timer.min,
113                 .extra2         = &xfs_params.syncd_timer.max
114         },
115         {
116                 .procname       = "inherit_sync",
117                 .data           = &xfs_params.inherit_sync.val,
118                 .maxlen         = sizeof(int),
119                 .mode           = 0644,
120                 .proc_handler   = proc_dointvec_minmax,
121                 .extra1         = &xfs_params.inherit_sync.min,
122                 .extra2         = &xfs_params.inherit_sync.max
123         },
124         {
125                 .procname       = "inherit_nodump",
126                 .data           = &xfs_params.inherit_nodump.val,
127                 .maxlen         = sizeof(int),
128                 .mode           = 0644,
129                 .proc_handler   = proc_dointvec_minmax,
130                 .extra1         = &xfs_params.inherit_nodump.min,
131                 .extra2         = &xfs_params.inherit_nodump.max
132         },
133         {
134                 .procname       = "inherit_noatime",
135                 .data           = &xfs_params.inherit_noatim.val,
136                 .maxlen         = sizeof(int),
137                 .mode           = 0644,
138                 .proc_handler   = proc_dointvec_minmax,
139                 .extra1         = &xfs_params.inherit_noatim.min,
140                 .extra2         = &xfs_params.inherit_noatim.max
141         },
142         {
143                 .procname       = "inherit_nosymlinks",
144                 .data           = &xfs_params.inherit_nosym.val,
145                 .maxlen         = sizeof(int),
146                 .mode           = 0644,
147                 .proc_handler   = proc_dointvec_minmax,
148                 .extra1         = &xfs_params.inherit_nosym.min,
149                 .extra2         = &xfs_params.inherit_nosym.max
150         },
151         {
152                 .procname       = "rotorstep",
153                 .data           = &xfs_params.rotorstep.val,
154                 .maxlen         = sizeof(int),
155                 .mode           = 0644,
156                 .proc_handler   = proc_dointvec_minmax,
157                 .extra1         = &xfs_params.rotorstep.min,
158                 .extra2         = &xfs_params.rotorstep.max
159         },
160         {
161                 .procname       = "inherit_nodefrag",
162                 .data           = &xfs_params.inherit_nodfrg.val,
163                 .maxlen         = sizeof(int),
164                 .mode           = 0644,
165                 .proc_handler   = proc_dointvec_minmax,
166                 .extra1         = &xfs_params.inherit_nodfrg.min,
167                 .extra2         = &xfs_params.inherit_nodfrg.max
168         },
169         {
170                 .procname       = "filestream_centisecs",
171                 .data           = &xfs_params.fstrm_timer.val,
172                 .maxlen         = sizeof(int),
173                 .mode           = 0644,
174                 .proc_handler   = proc_dointvec_minmax,
175                 .extra1         = &xfs_params.fstrm_timer.min,
176                 .extra2         = &xfs_params.fstrm_timer.max,
177         },
178         {
179                 .procname       = "speculative_prealloc_lifetime",
180                 .data           = &xfs_params.eofb_timer.val,
181                 .maxlen         = sizeof(int),
182                 .mode           = 0644,
183                 .proc_handler   = proc_dointvec_minmax,
184                 .extra1         = &xfs_params.eofb_timer.min,
185                 .extra2         = &xfs_params.eofb_timer.max,
186         },
187         /* please keep this the last entry */
188 #ifdef CONFIG_PROC_FS
189         {
190                 .procname       = "stats_clear",
191                 .data           = &xfs_params.stats_clear.val,
192                 .maxlen         = sizeof(int),
193                 .mode           = 0644,
194                 .proc_handler   = xfs_stats_clear_proc_handler,
195                 .extra1         = &xfs_params.stats_clear.min,
196                 .extra2         = &xfs_params.stats_clear.max
197         },
198 #endif /* CONFIG_PROC_FS */
199
200         {}
201 };
202
203 static struct ctl_table xfs_dir_table[] = {
204         {
205                 .procname       = "xfs",
206                 .mode           = 0555,
207                 .child          = xfs_table
208         },
209         {}
210 };
211
212 static struct ctl_table xfs_root_table[] = {
213         {
214                 .procname       = "fs",
215                 .mode           = 0555,
216                 .child          = xfs_dir_table
217         },
218         {}
219 };
220
221 int
222 xfs_sysctl_register(void)
223 {
224         xfs_table_header = register_sysctl_table(xfs_root_table);
225         if (!xfs_table_header)
226                 return -ENOMEM;
227         return 0;
228 }
229
230 void
231 xfs_sysctl_unregister(void)
232 {
233         unregister_sysctl_table(xfs_table_header);
234 }