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 <linux/sysctl.h> 8 #include <linux/proc_fs.h> 9 #include "xfs_error.h" 10 #include "xfs_stats.h" 11 12 static struct ctl_table_header *xfs_table_header; 13 14 #ifdef CONFIG_PROC_FS 15 STATIC int 16 xfs_stats_clear_proc_handler( 17 struct ctl_table *ctl, 18 int write, 19 void __user *buffer, 20 size_t *lenp, 21 loff_t *ppos) 22 { 23 int ret, *valp = ctl->data; 24 25 ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos); 26 27 if (!ret && write && *valp) { 28 xfs_stats_clearall(xfsstats.xs_stats); 29 xfs_stats_clear = 0; 30 } 31 32 return ret; 33 } 34 35 STATIC int 36 xfs_panic_mask_proc_handler( 37 struct ctl_table *ctl, 38 int write, 39 void __user *buffer, 40 size_t *lenp, 41 loff_t *ppos) 42 { 43 int ret, *valp = ctl->data; 44 45 ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos); 46 if (!ret && write) { 47 xfs_panic_mask = *valp; 48 #ifdef DEBUG 49 xfs_panic_mask |= (XFS_PTAG_SHUTDOWN_CORRUPT | XFS_PTAG_LOGRES); 50 #endif 51 } 52 return ret; 53 } 54 #endif /* CONFIG_PROC_FS */ 55 56 static struct ctl_table xfs_table[] = { 57 { 58 .procname = "irix_sgid_inherit", 59 .data = &xfs_params.sgid_inherit.val, 60 .maxlen = sizeof(int), 61 .mode = 0644, 62 .proc_handler = proc_dointvec_minmax, 63 .extra1 = &xfs_params.sgid_inherit.min, 64 .extra2 = &xfs_params.sgid_inherit.max 65 }, 66 { 67 .procname = "irix_symlink_mode", 68 .data = &xfs_params.symlink_mode.val, 69 .maxlen = sizeof(int), 70 .mode = 0644, 71 .proc_handler = proc_dointvec_minmax, 72 .extra1 = &xfs_params.symlink_mode.min, 73 .extra2 = &xfs_params.symlink_mode.max 74 }, 75 { 76 .procname = "panic_mask", 77 .data = &xfs_params.panic_mask.val, 78 .maxlen = sizeof(int), 79 .mode = 0644, 80 .proc_handler = xfs_panic_mask_proc_handler, 81 .extra1 = &xfs_params.panic_mask.min, 82 .extra2 = &xfs_params.panic_mask.max 83 }, 84 85 { 86 .procname = "error_level", 87 .data = &xfs_params.error_level.val, 88 .maxlen = sizeof(int), 89 .mode = 0644, 90 .proc_handler = proc_dointvec_minmax, 91 .extra1 = &xfs_params.error_level.min, 92 .extra2 = &xfs_params.error_level.max 93 }, 94 { 95 .procname = "xfssyncd_centisecs", 96 .data = &xfs_params.syncd_timer.val, 97 .maxlen = sizeof(int), 98 .mode = 0644, 99 .proc_handler = proc_dointvec_minmax, 100 .extra1 = &xfs_params.syncd_timer.min, 101 .extra2 = &xfs_params.syncd_timer.max 102 }, 103 { 104 .procname = "inherit_sync", 105 .data = &xfs_params.inherit_sync.val, 106 .maxlen = sizeof(int), 107 .mode = 0644, 108 .proc_handler = proc_dointvec_minmax, 109 .extra1 = &xfs_params.inherit_sync.min, 110 .extra2 = &xfs_params.inherit_sync.max 111 }, 112 { 113 .procname = "inherit_nodump", 114 .data = &xfs_params.inherit_nodump.val, 115 .maxlen = sizeof(int), 116 .mode = 0644, 117 .proc_handler = proc_dointvec_minmax, 118 .extra1 = &xfs_params.inherit_nodump.min, 119 .extra2 = &xfs_params.inherit_nodump.max 120 }, 121 { 122 .procname = "inherit_noatime", 123 .data = &xfs_params.inherit_noatim.val, 124 .maxlen = sizeof(int), 125 .mode = 0644, 126 .proc_handler = proc_dointvec_minmax, 127 .extra1 = &xfs_params.inherit_noatim.min, 128 .extra2 = &xfs_params.inherit_noatim.max 129 }, 130 { 131 .procname = "inherit_nosymlinks", 132 .data = &xfs_params.inherit_nosym.val, 133 .maxlen = sizeof(int), 134 .mode = 0644, 135 .proc_handler = proc_dointvec_minmax, 136 .extra1 = &xfs_params.inherit_nosym.min, 137 .extra2 = &xfs_params.inherit_nosym.max 138 }, 139 { 140 .procname = "rotorstep", 141 .data = &xfs_params.rotorstep.val, 142 .maxlen = sizeof(int), 143 .mode = 0644, 144 .proc_handler = proc_dointvec_minmax, 145 .extra1 = &xfs_params.rotorstep.min, 146 .extra2 = &xfs_params.rotorstep.max 147 }, 148 { 149 .procname = "inherit_nodefrag", 150 .data = &xfs_params.inherit_nodfrg.val, 151 .maxlen = sizeof(int), 152 .mode = 0644, 153 .proc_handler = proc_dointvec_minmax, 154 .extra1 = &xfs_params.inherit_nodfrg.min, 155 .extra2 = &xfs_params.inherit_nodfrg.max 156 }, 157 { 158 .procname = "filestream_centisecs", 159 .data = &xfs_params.fstrm_timer.val, 160 .maxlen = sizeof(int), 161 .mode = 0644, 162 .proc_handler = proc_dointvec_minmax, 163 .extra1 = &xfs_params.fstrm_timer.min, 164 .extra2 = &xfs_params.fstrm_timer.max, 165 }, 166 { 167 .procname = "speculative_prealloc_lifetime", 168 .data = &xfs_params.eofb_timer.val, 169 .maxlen = sizeof(int), 170 .mode = 0644, 171 .proc_handler = proc_dointvec_minmax, 172 .extra1 = &xfs_params.eofb_timer.min, 173 .extra2 = &xfs_params.eofb_timer.max, 174 }, 175 { 176 .procname = "speculative_cow_prealloc_lifetime", 177 .data = &xfs_params.cowb_timer.val, 178 .maxlen = sizeof(int), 179 .mode = 0644, 180 .proc_handler = proc_dointvec_minmax, 181 .extra1 = &xfs_params.cowb_timer.min, 182 .extra2 = &xfs_params.cowb_timer.max, 183 }, 184 /* please keep this the last entry */ 185 #ifdef CONFIG_PROC_FS 186 { 187 .procname = "stats_clear", 188 .data = &xfs_params.stats_clear.val, 189 .maxlen = sizeof(int), 190 .mode = 0644, 191 .proc_handler = xfs_stats_clear_proc_handler, 192 .extra1 = &xfs_params.stats_clear.min, 193 .extra2 = &xfs_params.stats_clear.max 194 }, 195 #endif /* CONFIG_PROC_FS */ 196 197 {} 198 }; 199 200 static struct ctl_table xfs_dir_table[] = { 201 { 202 .procname = "xfs", 203 .mode = 0555, 204 .child = xfs_table 205 }, 206 {} 207 }; 208 209 static struct ctl_table xfs_root_table[] = { 210 { 211 .procname = "fs", 212 .mode = 0555, 213 .child = xfs_dir_table 214 }, 215 {} 216 }; 217 218 int 219 xfs_sysctl_register(void) 220 { 221 xfs_table_header = register_sysctl_table(xfs_root_table); 222 if (!xfs_table_header) 223 return -ENOMEM; 224 return 0; 225 } 226 227 void 228 xfs_sysctl_unregister(void) 229 { 230 unregister_sysctl_table(xfs_table_header); 231 } 232