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 13 xfs_stats_clear_proc_handler( 14 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 33 xfs_panic_mask_proc_handler( 34 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 int 54 xfs_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 69 STATIC int 70 xfs_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 85 static struct ctl_table xfs_table[] = { 86 { 87 .procname = "irix_sgid_inherit", 88 .data = &xfs_params.sgid_inherit.val, 89 .maxlen = sizeof(int), 90 .mode = 0644, 91 .proc_handler = xfs_deprecate_irix_sgid_inherit_proc_handler, 92 .extra1 = &xfs_params.sgid_inherit.min, 93 .extra2 = &xfs_params.sgid_inherit.max 94 }, 95 { 96 .procname = "irix_symlink_mode", 97 .data = &xfs_params.symlink_mode.val, 98 .maxlen = sizeof(int), 99 .mode = 0644, 100 .proc_handler = xfs_deprecate_irix_symlink_mode_proc_handler, 101 .extra1 = &xfs_params.symlink_mode.min, 102 .extra2 = &xfs_params.symlink_mode.max 103 }, 104 { 105 .procname = "panic_mask", 106 .data = &xfs_params.panic_mask.val, 107 .maxlen = sizeof(int), 108 .mode = 0644, 109 .proc_handler = xfs_panic_mask_proc_handler, 110 .extra1 = &xfs_params.panic_mask.min, 111 .extra2 = &xfs_params.panic_mask.max 112 }, 113 114 { 115 .procname = "error_level", 116 .data = &xfs_params.error_level.val, 117 .maxlen = sizeof(int), 118 .mode = 0644, 119 .proc_handler = proc_dointvec_minmax, 120 .extra1 = &xfs_params.error_level.min, 121 .extra2 = &xfs_params.error_level.max 122 }, 123 { 124 .procname = "xfssyncd_centisecs", 125 .data = &xfs_params.syncd_timer.val, 126 .maxlen = sizeof(int), 127 .mode = 0644, 128 .proc_handler = proc_dointvec_minmax, 129 .extra1 = &xfs_params.syncd_timer.min, 130 .extra2 = &xfs_params.syncd_timer.max 131 }, 132 { 133 .procname = "inherit_sync", 134 .data = &xfs_params.inherit_sync.val, 135 .maxlen = sizeof(int), 136 .mode = 0644, 137 .proc_handler = proc_dointvec_minmax, 138 .extra1 = &xfs_params.inherit_sync.min, 139 .extra2 = &xfs_params.inherit_sync.max 140 }, 141 { 142 .procname = "inherit_nodump", 143 .data = &xfs_params.inherit_nodump.val, 144 .maxlen = sizeof(int), 145 .mode = 0644, 146 .proc_handler = proc_dointvec_minmax, 147 .extra1 = &xfs_params.inherit_nodump.min, 148 .extra2 = &xfs_params.inherit_nodump.max 149 }, 150 { 151 .procname = "inherit_noatime", 152 .data = &xfs_params.inherit_noatim.val, 153 .maxlen = sizeof(int), 154 .mode = 0644, 155 .proc_handler = proc_dointvec_minmax, 156 .extra1 = &xfs_params.inherit_noatim.min, 157 .extra2 = &xfs_params.inherit_noatim.max 158 }, 159 { 160 .procname = "inherit_nosymlinks", 161 .data = &xfs_params.inherit_nosym.val, 162 .maxlen = sizeof(int), 163 .mode = 0644, 164 .proc_handler = proc_dointvec_minmax, 165 .extra1 = &xfs_params.inherit_nosym.min, 166 .extra2 = &xfs_params.inherit_nosym.max 167 }, 168 { 169 .procname = "rotorstep", 170 .data = &xfs_params.rotorstep.val, 171 .maxlen = sizeof(int), 172 .mode = 0644, 173 .proc_handler = proc_dointvec_minmax, 174 .extra1 = &xfs_params.rotorstep.min, 175 .extra2 = &xfs_params.rotorstep.max 176 }, 177 { 178 .procname = "inherit_nodefrag", 179 .data = &xfs_params.inherit_nodfrg.val, 180 .maxlen = sizeof(int), 181 .mode = 0644, 182 .proc_handler = proc_dointvec_minmax, 183 .extra1 = &xfs_params.inherit_nodfrg.min, 184 .extra2 = &xfs_params.inherit_nodfrg.max 185 }, 186 { 187 .procname = "filestream_centisecs", 188 .data = &xfs_params.fstrm_timer.val, 189 .maxlen = sizeof(int), 190 .mode = 0644, 191 .proc_handler = proc_dointvec_minmax, 192 .extra1 = &xfs_params.fstrm_timer.min, 193 .extra2 = &xfs_params.fstrm_timer.max, 194 }, 195 { 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 }, 204 { 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 }, 213 /* please keep this the last entry */ 214 #ifdef CONFIG_PROC_FS 215 { 216 .procname = "stats_clear", 217 .data = &xfs_params.stats_clear.val, 218 .maxlen = sizeof(int), 219 .mode = 0644, 220 .proc_handler = xfs_stats_clear_proc_handler, 221 .extra1 = &xfs_params.stats_clear.min, 222 .extra2 = &xfs_params.stats_clear.max 223 }, 224 #endif /* CONFIG_PROC_FS */ 225 226 {} 227 }; 228 229 static struct ctl_table xfs_dir_table[] = { 230 { 231 .procname = "xfs", 232 .mode = 0555, 233 .child = xfs_table 234 }, 235 {} 236 }; 237 238 static struct ctl_table xfs_root_table[] = { 239 { 240 .procname = "fs", 241 .mode = 0555, 242 .child = xfs_dir_table 243 }, 244 {} 245 }; 246 247 int 248 xfs_sysctl_register(void) 249 { 250 xfs_table_header = register_sysctl_table(xfs_root_table); 251 if (!xfs_table_header) 252 return -ENOMEM; 253 return 0; 254 } 255 256 void 257 xfs_sysctl_unregister(void) 258 { 259 unregister_sysctl_table(xfs_table_header); 260 } 261