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
xfs_stats_clear_proc_handler(const struct ctl_table * ctl,int write,void * buffer,size_t * lenp,loff_t * ppos)13 xfs_stats_clear_proc_handler(
14 const 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
xfs_panic_mask_proc_handler(const struct ctl_table * ctl,int write,void * buffer,size_t * lenp,loff_t * ppos)33 xfs_panic_mask_proc_handler(
34 const 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 inline int
xfs_deprecated_dointvec_minmax(const struct ctl_table * ctl,int write,void * buffer,size_t * lenp,loff_t * ppos)54 xfs_deprecated_dointvec_minmax(
55 const struct ctl_table *ctl,
56 int write,
57 void *buffer,
58 size_t *lenp,
59 loff_t *ppos)
60 {
61 if (write) {
62 printk_ratelimited(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
69 static const struct ctl_table xfs_table[] = {
70 {
71 .procname = "panic_mask",
72 .data = &xfs_params.panic_mask.val,
73 .maxlen = sizeof(int),
74 .mode = 0644,
75 .proc_handler = xfs_panic_mask_proc_handler,
76 .extra1 = &xfs_params.panic_mask.min,
77 .extra2 = &xfs_params.panic_mask.max
78 },
79
80 {
81 .procname = "error_level",
82 .data = &xfs_params.error_level.val,
83 .maxlen = sizeof(int),
84 .mode = 0644,
85 .proc_handler = proc_dointvec_minmax,
86 .extra1 = &xfs_params.error_level.min,
87 .extra2 = &xfs_params.error_level.max
88 },
89 {
90 .procname = "xfssyncd_centisecs",
91 .data = &xfs_params.syncd_timer.val,
92 .maxlen = sizeof(int),
93 .mode = 0644,
94 .proc_handler = proc_dointvec_minmax,
95 .extra1 = &xfs_params.syncd_timer.min,
96 .extra2 = &xfs_params.syncd_timer.max
97 },
98 {
99 .procname = "inherit_sync",
100 .data = &xfs_params.inherit_sync.val,
101 .maxlen = sizeof(int),
102 .mode = 0644,
103 .proc_handler = proc_dointvec_minmax,
104 .extra1 = &xfs_params.inherit_sync.min,
105 .extra2 = &xfs_params.inherit_sync.max
106 },
107 {
108 .procname = "inherit_nodump",
109 .data = &xfs_params.inherit_nodump.val,
110 .maxlen = sizeof(int),
111 .mode = 0644,
112 .proc_handler = proc_dointvec_minmax,
113 .extra1 = &xfs_params.inherit_nodump.min,
114 .extra2 = &xfs_params.inherit_nodump.max
115 },
116 {
117 .procname = "inherit_noatime",
118 .data = &xfs_params.inherit_noatim.val,
119 .maxlen = sizeof(int),
120 .mode = 0644,
121 .proc_handler = proc_dointvec_minmax,
122 .extra1 = &xfs_params.inherit_noatim.min,
123 .extra2 = &xfs_params.inherit_noatim.max
124 },
125 {
126 .procname = "inherit_nosymlinks",
127 .data = &xfs_params.inherit_nosym.val,
128 .maxlen = sizeof(int),
129 .mode = 0644,
130 .proc_handler = proc_dointvec_minmax,
131 .extra1 = &xfs_params.inherit_nosym.min,
132 .extra2 = &xfs_params.inherit_nosym.max
133 },
134 {
135 .procname = "rotorstep",
136 .data = &xfs_params.rotorstep.val,
137 .maxlen = sizeof(int),
138 .mode = 0644,
139 .proc_handler = proc_dointvec_minmax,
140 .extra1 = &xfs_params.rotorstep.min,
141 .extra2 = &xfs_params.rotorstep.max
142 },
143 {
144 .procname = "inherit_nodefrag",
145 .data = &xfs_params.inherit_nodfrg.val,
146 .maxlen = sizeof(int),
147 .mode = 0644,
148 .proc_handler = proc_dointvec_minmax,
149 .extra1 = &xfs_params.inherit_nodfrg.min,
150 .extra2 = &xfs_params.inherit_nodfrg.max
151 },
152 {
153 .procname = "filestream_centisecs",
154 .data = &xfs_params.fstrm_timer.val,
155 .maxlen = sizeof(int),
156 .mode = 0644,
157 .proc_handler = proc_dointvec_minmax,
158 .extra1 = &xfs_params.fstrm_timer.min,
159 .extra2 = &xfs_params.fstrm_timer.max,
160 },
161 {
162 .procname = "speculative_prealloc_lifetime",
163 .data = &xfs_params.blockgc_timer.val,
164 .maxlen = sizeof(int),
165 .mode = 0644,
166 .proc_handler = proc_dointvec_minmax,
167 .extra1 = &xfs_params.blockgc_timer.min,
168 .extra2 = &xfs_params.blockgc_timer.max,
169 },
170 /* please keep this the last entry */
171 #ifdef CONFIG_PROC_FS
172 {
173 .procname = "stats_clear",
174 .data = &xfs_params.stats_clear.val,
175 .maxlen = sizeof(int),
176 .mode = 0644,
177 .proc_handler = xfs_stats_clear_proc_handler,
178 .extra1 = &xfs_params.stats_clear.min,
179 .extra2 = &xfs_params.stats_clear.max
180 },
181 #endif /* CONFIG_PROC_FS */
182 };
183
184 int
xfs_sysctl_register(void)185 xfs_sysctl_register(void)
186 {
187 xfs_table_header = register_sysctl("fs/xfs", xfs_table);
188 if (!xfs_table_header)
189 return -ENOMEM;
190 return 0;
191 }
192
193 void
xfs_sysctl_unregister(void)194 xfs_sysctl_unregister(void)
195 {
196 unregister_sysctl_table(xfs_table_header);
197 }
198