blob: fac9de7ee6d00ad62ba29b59c547841350f75378 [file] [log] [blame]
Dave Chinner0b61f8a2018-06-05 19:42:14 -07001// SPDX-License-Identifier: GPL-2.0
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
Nathan Scott7b718762005-11-02 14:58:39 +11003 * Copyright (c) 2001-2005 Silicon Graphics, Inc.
4 * All Rights Reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07005 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07006#include "xfs.h"
Dave Chinner73efe4a2011-01-12 00:35:42 +00007#include "xfs_error.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -07008
Linus Torvalds1da177e2005-04-16 15:20:36 -07009static struct ctl_table_header *xfs_table_header;
10
Linus Torvalds1da177e2005-04-16 15:20:36 -070011#ifdef CONFIG_PROC_FS
12STATIC int
13xfs_stats_clear_proc_handler(
Joe Perchesb2410e92013-06-13 19:37:50 -070014 struct ctl_table *ctl,
15 int write,
Christoph Hellwig32927392020-04-24 08:43:38 +020016 void *buffer,
Joe Perchesb2410e92013-06-13 19:37:50 -070017 size_t *lenp,
18 loff_t *ppos)
Linus Torvalds1da177e2005-04-16 15:20:36 -070019{
Bill O'Donnellbb230c12015-10-12 05:15:45 +110020 int ret, *valp = ctl->data;
Linus Torvalds1da177e2005-04-16 15:20:36 -070021
Alexey Dobriyan8d65af72009-09-23 15:57:19 -070022 ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
Linus Torvalds1da177e2005-04-16 15:20:36 -070023
24 if (!ret && write && *valp) {
Bill O'Donnell80529c42015-10-12 05:19:45 +110025 xfs_stats_clearall(xfsstats.xs_stats);
Linus Torvalds1da177e2005-04-16 15:20:36 -070026 xfs_stats_clear = 0;
27 }
28
29 return ret;
30}
Dave Chinner73efe4a2011-01-12 00:35:42 +000031
32STATIC int
33xfs_panic_mask_proc_handler(
Joe Perchesb2410e92013-06-13 19:37:50 -070034 struct ctl_table *ctl,
35 int write,
Christoph Hellwig32927392020-04-24 08:43:38 +020036 void *buffer,
Joe Perchesb2410e92013-06-13 19:37:50 -070037 size_t *lenp,
38 loff_t *ppos)
Dave Chinner73efe4a2011-01-12 00:35:42 +000039{
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}
Linus Torvalds1da177e2005-04-16 15:20:36 -070051#endif /* CONFIG_PROC_FS */
52
Pavel Reichl3442de92020-09-25 11:11:37 -070053STATIC int
54xfs_deprecate_irix_sgid_inherit_proc_handler(
55 struct ctl_table *ctl,
56 int write,
57 void *buffer,
58 size_t *lenp,
59 loff_t *ppos)
60{
61 if (write) {
62 printk_once(KERN_WARNING
63 "XFS: " "%s sysctl option is deprecated.\n",
64 ctl->procname);
65 }
66 return proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
67}
68
69STATIC int
70xfs_deprecate_irix_symlink_mode_proc_handler(
71 struct ctl_table *ctl,
72 int write,
73 void *buffer,
74 size_t *lenp,
75 loff_t *ppos)
76{
77 if (write) {
78 printk_once(KERN_WARNING
79 "XFS: " "%s sysctl option is deprecated.\n",
80 ctl->procname);
81 }
82 return proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
83}
84
Joe Perchesb2410e92013-06-13 19:37:50 -070085static struct ctl_table xfs_table[] = {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110086 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110087 .procname = "irix_sgid_inherit",
88 .data = &xfs_params.sgid_inherit.val,
89 .maxlen = sizeof(int),
90 .mode = 0644,
Pavel Reichl3442de92020-09-25 11:11:37 -070091 .proc_handler = xfs_deprecate_irix_sgid_inherit_proc_handler,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110092 .extra1 = &xfs_params.sgid_inherit.min,
93 .extra2 = &xfs_params.sgid_inherit.max
94 },
95 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +110096 .procname = "irix_symlink_mode",
97 .data = &xfs_params.symlink_mode.val,
98 .maxlen = sizeof(int),
99 .mode = 0644,
Pavel Reichl3442de92020-09-25 11:11:37 -0700100 .proc_handler = xfs_deprecate_irix_symlink_mode_proc_handler,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100101 .extra1 = &xfs_params.symlink_mode.min,
102 .extra2 = &xfs_params.symlink_mode.max
103 },
104 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100105 .procname = "panic_mask",
106 .data = &xfs_params.panic_mask.val,
107 .maxlen = sizeof(int),
108 .mode = 0644,
Dave Chinner73efe4a2011-01-12 00:35:42 +0000109 .proc_handler = xfs_panic_mask_proc_handler,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100110 .extra1 = &xfs_params.panic_mask.min,
111 .extra2 = &xfs_params.panic_mask.max
112 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700113
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100114 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100115 .procname = "error_level",
116 .data = &xfs_params.error_level.val,
117 .maxlen = sizeof(int),
118 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800119 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100120 .extra1 = &xfs_params.error_level.min,
121 .extra2 = &xfs_params.error_level.max
122 },
123 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100124 .procname = "xfssyncd_centisecs",
125 .data = &xfs_params.syncd_timer.val,
126 .maxlen = sizeof(int),
127 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800128 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100129 .extra1 = &xfs_params.syncd_timer.min,
130 .extra2 = &xfs_params.syncd_timer.max
131 },
132 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100133 .procname = "inherit_sync",
134 .data = &xfs_params.inherit_sync.val,
135 .maxlen = sizeof(int),
136 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800137 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100138 .extra1 = &xfs_params.inherit_sync.min,
139 .extra2 = &xfs_params.inherit_sync.max
140 },
141 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100142 .procname = "inherit_nodump",
143 .data = &xfs_params.inherit_nodump.val,
144 .maxlen = sizeof(int),
145 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800146 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100147 .extra1 = &xfs_params.inherit_nodump.min,
148 .extra2 = &xfs_params.inherit_nodump.max
149 },
150 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100151 .procname = "inherit_noatime",
152 .data = &xfs_params.inherit_noatim.val,
153 .maxlen = sizeof(int),
154 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800155 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100156 .extra1 = &xfs_params.inherit_noatim.min,
157 .extra2 = &xfs_params.inherit_noatim.max
158 },
159 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100160 .procname = "inherit_nosymlinks",
161 .data = &xfs_params.inherit_nosym.val,
162 .maxlen = sizeof(int),
163 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800164 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100165 .extra1 = &xfs_params.inherit_nosym.min,
166 .extra2 = &xfs_params.inherit_nosym.max
167 },
168 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100169 .procname = "rotorstep",
170 .data = &xfs_params.rotorstep.val,
171 .maxlen = sizeof(int),
172 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800173 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100174 .extra1 = &xfs_params.rotorstep.min,
175 .extra2 = &xfs_params.rotorstep.max
176 },
177 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100178 .procname = "inherit_nodefrag",
179 .data = &xfs_params.inherit_nodfrg.val,
180 .maxlen = sizeof(int),
181 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800182 .proc_handler = proc_dointvec_minmax,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100183 .extra1 = &xfs_params.inherit_nodfrg.min,
184 .extra2 = &xfs_params.inherit_nodfrg.max
185 },
David Chinner2a82b8b2007-07-11 11:09:12 +1000186 {
David Chinner2a82b8b2007-07-11 11:09:12 +1000187 .procname = "filestream_centisecs",
188 .data = &xfs_params.fstrm_timer.val,
189 .maxlen = sizeof(int),
190 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800191 .proc_handler = proc_dointvec_minmax,
David Chinner2a82b8b2007-07-11 11:09:12 +1000192 .extra1 = &xfs_params.fstrm_timer.min,
193 .extra2 = &xfs_params.fstrm_timer.max,
194 },
Brian Foster579b62f2012-11-06 09:50:47 -0500195 {
196 .procname = "speculative_prealloc_lifetime",
197 .data = &xfs_params.eofb_timer.val,
198 .maxlen = sizeof(int),
199 .mode = 0644,
200 .proc_handler = proc_dointvec_minmax,
201 .extra1 = &xfs_params.eofb_timer.min,
202 .extra2 = &xfs_params.eofb_timer.max,
203 },
Darrick J. Wong83104d42016-10-03 09:11:46 -0700204 {
205 .procname = "speculative_cow_prealloc_lifetime",
206 .data = &xfs_params.cowb_timer.val,
207 .maxlen = sizeof(int),
208 .mode = 0644,
209 .proc_handler = proc_dointvec_minmax,
210 .extra1 = &xfs_params.cowb_timer.min,
211 .extra2 = &xfs_params.cowb_timer.max,
212 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700213 /* please keep this the last entry */
214#ifdef CONFIG_PROC_FS
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100215 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100216 .procname = "stats_clear",
217 .data = &xfs_params.stats_clear.val,
218 .maxlen = sizeof(int),
219 .mode = 0644,
Eric W. Biederman6d456112009-11-16 03:11:48 -0800220 .proc_handler = xfs_stats_clear_proc_handler,
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100221 .extra1 = &xfs_params.stats_clear.min,
222 .extra2 = &xfs_params.stats_clear.max
223 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700224#endif /* CONFIG_PROC_FS */
225
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100226 {}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700227};
228
Joe Perchesb2410e92013-06-13 19:37:50 -0700229static struct ctl_table xfs_dir_table[] = {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100230 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100231 .procname = "xfs",
232 .mode = 0555,
233 .child = xfs_table
234 },
235 {}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700236};
237
Joe Perchesb2410e92013-06-13 19:37:50 -0700238static struct ctl_table xfs_root_table[] = {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100239 {
Eric W. Biederman3a68cbf2007-02-10 18:36:59 +1100240 .procname = "fs",
241 .mode = 0555,
242 .child = xfs_dir_table
243 },
244 {}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700245};
246
Christoph Hellwig9f8868f2008-07-18 17:11:46 +1000247int
Linus Torvalds1da177e2005-04-16 15:20:36 -0700248xfs_sysctl_register(void)
249{
Eric W. Biederman0b4d4142007-02-14 00:34:09 -0800250 xfs_table_header = register_sysctl_table(xfs_root_table);
Christoph Hellwig9f8868f2008-07-18 17:11:46 +1000251 if (!xfs_table_header)
252 return -ENOMEM;
253 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700254}
255
256void
257xfs_sysctl_unregister(void)
258{
Christoph Hellwig9f8868f2008-07-18 17:11:46 +1000259 unregister_sysctl_table(xfs_table_header);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700260}