blob: 2801b5ce6cdb61d9ba03a1b518561a64924a7068 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Nathan Scott7b718762005-11-02 14:58:39 +11002 * Copyright (c) 2001-2005 Silicon Graphics, Inc.
3 * All Rights Reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004 *
Nathan Scott7b718762005-11-02 14:58:39 +11005 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
Linus Torvalds1da177e2005-04-16 15:20:36 -07007 * published by the Free Software Foundation.
8 *
Nathan Scott7b718762005-11-02 14:58:39 +11009 * 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.
Linus Torvalds1da177e2005-04-16 15:20:36 -070013 *
Nathan Scott7b718762005-11-02 14:58:39 +110014 * 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
Linus Torvalds1da177e2005-04-16 15:20:36 -070017 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070018#include "xfs.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070019#include <linux/sysctl.h>
20#include <linux/proc_fs.h>
Dave Chinner73efe4a2011-01-12 00:35:42 +000021#include "xfs_error.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070022
Linus Torvalds1da177e2005-04-16 15:20:36 -070023static struct ctl_table_header *xfs_table_header;
24
Linus Torvalds1da177e2005-04-16 15:20:36 -070025#ifdef CONFIG_PROC_FS
26STATIC int
27xfs_stats_clear_proc_handler(
28 ctl_table *ctl,
29 int write,
Linus Torvalds1da177e2005-04-16 15:20:36 -070030 void __user *buffer,
31 size_t *lenp,
32 loff_t *ppos)
33{
34 int c, ret, *valp = ctl->data;
35 __uint32_t vn_active;
36
Alexey Dobriyan8d65af72009-09-23 15:57:19 -070037 ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
Linus Torvalds1da177e2005-04-16 15:20:36 -070038
39 if (!ret && write && *valp) {
Dave Chinner4f107002011-03-07 10:00:35 +110040 xfs_notice(NULL, "Clearing xfsstats");
KAMEZAWA Hiroyuki6f0419e2006-06-23 02:03:00 -070041 for_each_possible_cpu(c) {
Linus Torvalds1da177e2005-04-16 15:20:36 -070042 preempt_disable();
43 /* save vn_active, it's a universal truth! */
44 vn_active = per_cpu(xfsstats, c).vn_active;
45 memset(&per_cpu(xfsstats, c), 0,
46 sizeof(struct xfsstats));
47 per_cpu(xfsstats, c).vn_active = vn_active;
48 preempt_enable();
49 }
50 xfs_stats_clear = 0;
51 }
52
53 return ret;
54}
Dave Chinner73efe4a2011-01-12 00:35:42 +000055
56STATIC int
57xfs_panic_mask_proc_handler(
58 ctl_table *ctl,
59 int write,
60 void __user *buffer,
61 size_t *lenp,
62 loff_t *ppos)
63{
64 int ret, *valp = ctl->data;
65
66 ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
67 if (!ret && write) {
68 xfs_panic_mask = *valp;
69#ifdef DEBUG
70 xfs_panic_mask |= (XFS_PTAG_SHUTDOWN_CORRUPT | XFS_PTAG_LOGRES);
71#endif
72 }
73 return ret;
74}
Linus Torvalds1da177e2005-04-16 15:20:36 -070075#endif /* CONFIG_PROC_FS */
76
David Chinner7989cb82007-02-10 18:34:56 +110077static ctl_table xfs_table[] = {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110078 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110079 .procname = "irix_sgid_inherit",
80 .data = &xfs_params.sgid_inherit.val,
81 .maxlen = sizeof(int),
82 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -080083 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110084 .extra1 = &xfs_params.sgid_inherit.min,
85 .extra2 = &xfs_params.sgid_inherit.max
86 },
87 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110088 .procname = "irix_symlink_mode",
89 .data = &xfs_params.symlink_mode.val,
90 .maxlen = sizeof(int),
91 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -080092 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110093 .extra1 = &xfs_params.symlink_mode.min,
94 .extra2 = &xfs_params.symlink_mode.max
95 },
96 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110097 .procname = "panic_mask",
98 .data = &xfs_params.panic_mask.val,
99 .maxlen = sizeof(int),
100 .mode = 0644,
Dave Chinner73efe4a2011-01-12 00:35:42 +0000101 .proc_handler = xfs_panic_mask_proc_handler,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100102 .extra1 = &xfs_params.panic_mask.min,
103 .extra2 = &xfs_params.panic_mask.max
104 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100106 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100107 .procname = "error_level",
108 .data = &xfs_params.error_level.val,
109 .maxlen = sizeof(int),
110 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800111 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100112 .extra1 = &xfs_params.error_level.min,
113 .extra2 = &xfs_params.error_level.max
114 },
115 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100116 .procname = "xfssyncd_centisecs",
117 .data = &xfs_params.syncd_timer.val,
118 .maxlen = sizeof(int),
119 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800120 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100121 .extra1 = &xfs_params.syncd_timer.min,
122 .extra2 = &xfs_params.syncd_timer.max
123 },
124 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100125 .procname = "inherit_sync",
126 .data = &xfs_params.inherit_sync.val,
127 .maxlen = sizeof(int),
128 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800129 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100130 .extra1 = &xfs_params.inherit_sync.min,
131 .extra2 = &xfs_params.inherit_sync.max
132 },
133 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100134 .procname = "inherit_nodump",
135 .data = &xfs_params.inherit_nodump.val,
136 .maxlen = sizeof(int),
137 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800138 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100139 .extra1 = &xfs_params.inherit_nodump.min,
140 .extra2 = &xfs_params.inherit_nodump.max
141 },
142 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100143 .procname = "inherit_noatime",
144 .data = &xfs_params.inherit_noatim.val,
145 .maxlen = sizeof(int),
146 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800147 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100148 .extra1 = &xfs_params.inherit_noatim.min,
149 .extra2 = &xfs_params.inherit_noatim.max
150 },
151 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100152 .procname = "xfsbufd_centisecs",
153 .data = &xfs_params.xfs_buf_timer.val,
154 .maxlen = sizeof(int),
155 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800156 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100157 .extra1 = &xfs_params.xfs_buf_timer.min,
158 .extra2 = &xfs_params.xfs_buf_timer.max
159 },
160 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100161 .procname = "age_buffer_centisecs",
162 .data = &xfs_params.xfs_buf_age.val,
163 .maxlen = sizeof(int),
164 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800165 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100166 .extra1 = &xfs_params.xfs_buf_age.min,
167 .extra2 = &xfs_params.xfs_buf_age.max
168 },
169 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100170 .procname = "inherit_nosymlinks",
171 .data = &xfs_params.inherit_nosym.val,
172 .maxlen = sizeof(int),
173 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800174 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100175 .extra1 = &xfs_params.inherit_nosym.min,
176 .extra2 = &xfs_params.inherit_nosym.max
177 },
178 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100179 .procname = "rotorstep",
180 .data = &xfs_params.rotorstep.val,
181 .maxlen = sizeof(int),
182 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800183 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100184 .extra1 = &xfs_params.rotorstep.min,
185 .extra2 = &xfs_params.rotorstep.max
186 },
187 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100188 .procname = "inherit_nodefrag",
189 .data = &xfs_params.inherit_nodfrg.val,
190 .maxlen = sizeof(int),
191 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800192 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100193 .extra1 = &xfs_params.inherit_nodfrg.min,
194 .extra2 = &xfs_params.inherit_nodfrg.max
195 },
David Chinner2a82b8b2007-07-11 11:09:12 +1000196 {
David Chinner2a82b8b2007-07-11 11:09:12 +1000197 .procname = "filestream_centisecs",
198 .data = &xfs_params.fstrm_timer.val,
199 .maxlen = sizeof(int),
200 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800201 .proc_handler = proc_dointvec_minmax,
David Chinner2a82b8b2007-07-11 11:09:12 +1000202 .extra1 = &xfs_params.fstrm_timer.min,
203 .extra2 = &xfs_params.fstrm_timer.max,
204 },
Brian Foster579b62f2012-11-06 09:50:47 -0500205 {
206 .procname = "speculative_prealloc_lifetime",
207 .data = &xfs_params.eofb_timer.val,
208 .maxlen = sizeof(int),
209 .mode = 0644,
210 .proc_handler = proc_dointvec_minmax,
211 .extra1 = &xfs_params.eofb_timer.min,
212 .extra2 = &xfs_params.eofb_timer.max,
213 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700214 /* please keep this the last entry */
215#ifdef CONFIG_PROC_FS
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100216 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100217 .procname = "stats_clear",
218 .data = &xfs_params.stats_clear.val,
219 .maxlen = sizeof(int),
220 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800221 .proc_handler = xfs_stats_clear_proc_handler,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100222 .extra1 = &xfs_params.stats_clear.min,
223 .extra2 = &xfs_params.stats_clear.max
224 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700225#endif /* CONFIG_PROC_FS */
226
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100227 {}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700228};
229
David Chinner7989cb82007-02-10 18:34:56 +1100230static ctl_table xfs_dir_table[] = {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100231 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100232 .procname = "xfs",
233 .mode = 0555,
234 .child = xfs_table
235 },
236 {}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700237};
238
David Chinner7989cb82007-02-10 18:34:56 +1100239static ctl_table xfs_root_table[] = {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100240 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100241 .procname = "fs",
242 .mode = 0555,
243 .child = xfs_dir_table
244 },
245 {}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700246};
247
Christoph Hellwig9f8868f2008-07-18 17:11:46 +1000248int
Linus Torvalds1da177e2005-04-16 15:20:36 -0700249xfs_sysctl_register(void)
250{
Eric W. Biederman0b4d4142007-02-14 00:34:09 -0800251 xfs_table_header = register_sysctl_table(xfs_root_table);
Christoph Hellwig9f8868f2008-07-18 17:11:46 +1000252 if (!xfs_table_header)
253 return -ENOMEM;
254 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700255}
256
257void
258xfs_sysctl_unregister(void)
259{
Christoph Hellwig9f8868f2008-07-18 17:11:46 +1000260 unregister_sysctl_table(xfs_table_header);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700261}