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 { 188 .procname = "speculative_cow_prealloc_lifetime", 189 .data = &xfs_params.cowb_timer.val, 190 .maxlen = sizeof(int), 191 .mode = 0644, 192 .proc_handler = proc_dointvec_minmax, 193 .extra1 = &xfs_params.cowb_timer.min, 194 .extra2 = &xfs_params.cowb_timer.max, 195 }, 196 /* please keep this the last entry */ 197 #ifdef CONFIG_PROC_FS 198 { 199 .procname = "stats_clear", 200 .data = &xfs_params.stats_clear.val, 201 .maxlen = sizeof(int), 202 .mode = 0644, 203 .proc_handler = xfs_stats_clear_proc_handler, 204 .extra1 = &xfs_params.stats_clear.min, 205 .extra2 = &xfs_params.stats_clear.max 206 }, 207 #endif /* CONFIG_PROC_FS */ 208 209 {} 210 }; 211 212 static struct ctl_table xfs_dir_table[] = { 213 { 214 .procname = "xfs", 215 .mode = 0555, 216 .child = xfs_table 217 }, 218 {} 219 }; 220 221 static struct ctl_table xfs_root_table[] = { 222 { 223 .procname = "fs", 224 .mode = 0555, 225 .child = xfs_dir_table 226 }, 227 {} 228 }; 229 230 int 231 xfs_sysctl_register(void) 232 { 233 xfs_table_header = register_sysctl_table(xfs_root_table); 234 if (!xfs_table_header) 235 return -ENOMEM; 236 return 0; 237 } 238 239 void 240 xfs_sysctl_unregister(void) 241 { 242 unregister_sysctl_table(xfs_table_header); 243 } 244