blob: 7bb5092d6ae40796f5669eee25db1a1e04841dc5 [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>
21
Linus Torvalds1da177e2005-04-16 15:20:36 -070022static struct ctl_table_header *xfs_table_header;
23
Linus Torvalds1da177e2005-04-16 15:20:36 -070024#ifdef CONFIG_PROC_FS
25STATIC int
26xfs_stats_clear_proc_handler(
27 ctl_table *ctl,
28 int write,
Linus Torvalds1da177e2005-04-16 15:20:36 -070029 void __user *buffer,
30 size_t *lenp,
31 loff_t *ppos)
32{
33 int c, ret, *valp = ctl->data;
34 __uint32_t vn_active;
35
Alexey Dobriyan8d65af72009-09-23 15:57:19 -070036 ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
Linus Torvalds1da177e2005-04-16 15:20:36 -070037
38 if (!ret && write && *valp) {
39 printk("XFS Clearing xfsstats\n");
KAMEZAWA Hiroyuki6f0419e2006-06-23 02:03:00 -070040 for_each_possible_cpu(c) {
Linus Torvalds1da177e2005-04-16 15:20:36 -070041 preempt_disable();
42 /* save vn_active, it's a universal truth! */
43 vn_active = per_cpu(xfsstats, c).vn_active;
44 memset(&per_cpu(xfsstats, c), 0,
45 sizeof(struct xfsstats));
46 per_cpu(xfsstats, c).vn_active = vn_active;
47 preempt_enable();
48 }
49 xfs_stats_clear = 0;
50 }
51
52 return ret;
53}
54#endif /* CONFIG_PROC_FS */
55
David Chinner7989cb82007-02-10 18:34:56 +110056static ctl_table xfs_table[] = {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110057 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110058 .procname = "irix_sgid_inherit",
59 .data = &xfs_params.sgid_inherit.val,
60 .maxlen = sizeof(int),
61 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -080062 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110063 .extra1 = &xfs_params.sgid_inherit.min,
64 .extra2 = &xfs_params.sgid_inherit.max
65 },
66 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110067 .procname = "irix_symlink_mode",
68 .data = &xfs_params.symlink_mode.val,
69 .maxlen = sizeof(int),
70 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -080071 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110072 .extra1 = &xfs_params.symlink_mode.min,
73 .extra2 = &xfs_params.symlink_mode.max
74 },
75 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110076 .procname = "panic_mask",
77 .data = &xfs_params.panic_mask.val,
78 .maxlen = sizeof(int),
79 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -080080 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110081 .extra1 = &xfs_params.panic_mask.min,
82 .extra2 = &xfs_params.panic_mask.max
83 },
Linus Torvalds1da177e2005-04-16 15:20:36 -070084
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110085 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110086 .procname = "error_level",
87 .data = &xfs_params.error_level.val,
88 .maxlen = sizeof(int),
89 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -080090 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110091 .extra1 = &xfs_params.error_level.min,
92 .extra2 = &xfs_params.error_level.max
93 },
94 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110095 .procname = "xfssyncd_centisecs",
96 .data = &xfs_params.syncd_timer.val,
97 .maxlen = sizeof(int),
98 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -080099 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100100 .extra1 = &xfs_params.syncd_timer.min,
101 .extra2 = &xfs_params.syncd_timer.max
102 },
103 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100104 .procname = "inherit_sync",
105 .data = &xfs_params.inherit_sync.val,
106 .maxlen = sizeof(int),
107 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800108 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100109 .extra1 = &xfs_params.inherit_sync.min,
110 .extra2 = &xfs_params.inherit_sync.max
111 },
112 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100113 .procname = "inherit_nodump",
114 .data = &xfs_params.inherit_nodump.val,
115 .maxlen = sizeof(int),
116 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800117 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100118 .extra1 = &xfs_params.inherit_nodump.min,
119 .extra2 = &xfs_params.inherit_nodump.max
120 },
121 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100122 .procname = "inherit_noatime",
123 .data = &xfs_params.inherit_noatim.val,
124 .maxlen = sizeof(int),
125 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800126 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100127 .extra1 = &xfs_params.inherit_noatim.min,
128 .extra2 = &xfs_params.inherit_noatim.max
129 },
130 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100131 .procname = "xfsbufd_centisecs",
132 .data = &xfs_params.xfs_buf_timer.val,
133 .maxlen = sizeof(int),
134 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800135 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100136 .extra1 = &xfs_params.xfs_buf_timer.min,
137 .extra2 = &xfs_params.xfs_buf_timer.max
138 },
139 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100140 .procname = "age_buffer_centisecs",
141 .data = &xfs_params.xfs_buf_age.val,
142 .maxlen = sizeof(int),
143 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800144 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100145 .extra1 = &xfs_params.xfs_buf_age.min,
146 .extra2 = &xfs_params.xfs_buf_age.max
147 },
148 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100149 .procname = "inherit_nosymlinks",
150 .data = &xfs_params.inherit_nosym.val,
151 .maxlen = sizeof(int),
152 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800153 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100154 .extra1 = &xfs_params.inherit_nosym.min,
155 .extra2 = &xfs_params.inherit_nosym.max
156 },
157 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100158 .procname = "rotorstep",
159 .data = &xfs_params.rotorstep.val,
160 .maxlen = sizeof(int),
161 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800162 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100163 .extra1 = &xfs_params.rotorstep.min,
164 .extra2 = &xfs_params.rotorstep.max
165 },
166 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100167 .procname = "inherit_nodefrag",
168 .data = &xfs_params.inherit_nodfrg.val,
169 .maxlen = sizeof(int),
170 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800171 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100172 .extra1 = &xfs_params.inherit_nodfrg.min,
173 .extra2 = &xfs_params.inherit_nodfrg.max
174 },
David Chinner2a82b8b2007-07-11 11:09:12 +1000175 {
David Chinner2a82b8b2007-07-11 11:09:12 +1000176 .procname = "filestream_centisecs",
177 .data = &xfs_params.fstrm_timer.val,
178 .maxlen = sizeof(int),
179 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800180 .proc_handler = proc_dointvec_minmax,
David Chinner2a82b8b2007-07-11 11:09:12 +1000181 .extra1 = &xfs_params.fstrm_timer.min,
182 .extra2 = &xfs_params.fstrm_timer.max,
183 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700184 /* please keep this the last entry */
185#ifdef CONFIG_PROC_FS
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100186 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100187 .procname = "stats_clear",
188 .data = &xfs_params.stats_clear.val,
189 .maxlen = sizeof(int),
190 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800191 .proc_handler = xfs_stats_clear_proc_handler,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100192 .extra1 = &xfs_params.stats_clear.min,
193 .extra2 = &xfs_params.stats_clear.max
194 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700195#endif /* CONFIG_PROC_FS */
196
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100197 {}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700198};
199
David Chinner7989cb82007-02-10 18:34:56 +1100200static ctl_table xfs_dir_table[] = {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100201 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100202 .procname = "xfs",
203 .mode = 0555,
204 .child = xfs_table
205 },
206 {}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700207};
208
David Chinner7989cb82007-02-10 18:34:56 +1100209static ctl_table xfs_root_table[] = {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100210 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100211 .procname = "fs",
212 .mode = 0555,
213 .child = xfs_dir_table
214 },
215 {}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700216};
217
Christoph Hellwig9f8868f2008-07-18 17:11:46 +1000218int
Linus Torvalds1da177e2005-04-16 15:20:36 -0700219xfs_sysctl_register(void)
220{
Eric W. Biederman0b4d4142007-02-14 00:34:09 -0800221 xfs_table_header = register_sysctl_table(xfs_root_table);
Christoph Hellwig9f8868f2008-07-18 17:11:46 +1000222 if (!xfs_table_header)
223 return -ENOMEM;
224 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700225}
226
227void
228xfs_sysctl_unregister(void)
229{
Christoph Hellwig9f8868f2008-07-18 17:11:46 +1000230 unregister_sysctl_table(xfs_table_header);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700231}