225 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Copyright (c) 2001-2005 Silicon Graphics, Inc.4 * All Rights Reserved.5 */6#include "xfs.h"7#include "xfs_error.h"8 9static struct ctl_table_header *xfs_table_header;10 11#ifdef CONFIG_PROC_FS12STATIC int13xfs_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 32STATIC int33xfs_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 DEBUG46 xfs_panic_mask |= (XFS_PTAG_SHUTDOWN_CORRUPT | XFS_PTAG_LOGRES);47#endif48 }49 return ret;50}51#endif /* CONFIG_PROC_FS */52 53STATIC int54xfs_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_WARNING63 "XFS: %s sysctl option is deprecated.\n",64 ctl->procname);65 }66 return proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);67}68 69static struct ctl_table xfs_table[] = {70 {71 .procname = "irix_sgid_inherit",72 .data = &xfs_params.sgid_inherit.val,73 .maxlen = sizeof(int),74 .mode = 0644,75 .proc_handler = xfs_deprecated_dointvec_minmax,76 .extra1 = &xfs_params.sgid_inherit.min,77 .extra2 = &xfs_params.sgid_inherit.max78 },79 {80 .procname = "irix_symlink_mode",81 .data = &xfs_params.symlink_mode.val,82 .maxlen = sizeof(int),83 .mode = 0644,84 .proc_handler = xfs_deprecated_dointvec_minmax,85 .extra1 = &xfs_params.symlink_mode.min,86 .extra2 = &xfs_params.symlink_mode.max87 },88 {89 .procname = "panic_mask",90 .data = &xfs_params.panic_mask.val,91 .maxlen = sizeof(int),92 .mode = 0644,93 .proc_handler = xfs_panic_mask_proc_handler,94 .extra1 = &xfs_params.panic_mask.min,95 .extra2 = &xfs_params.panic_mask.max96 },97 98 {99 .procname = "error_level",100 .data = &xfs_params.error_level.val,101 .maxlen = sizeof(int),102 .mode = 0644,103 .proc_handler = proc_dointvec_minmax,104 .extra1 = &xfs_params.error_level.min,105 .extra2 = &xfs_params.error_level.max106 },107 {108 .procname = "xfssyncd_centisecs",109 .data = &xfs_params.syncd_timer.val,110 .maxlen = sizeof(int),111 .mode = 0644,112 .proc_handler = proc_dointvec_minmax,113 .extra1 = &xfs_params.syncd_timer.min,114 .extra2 = &xfs_params.syncd_timer.max115 },116 {117 .procname = "inherit_sync",118 .data = &xfs_params.inherit_sync.val,119 .maxlen = sizeof(int),120 .mode = 0644,121 .proc_handler = proc_dointvec_minmax,122 .extra1 = &xfs_params.inherit_sync.min,123 .extra2 = &xfs_params.inherit_sync.max124 },125 {126 .procname = "inherit_nodump",127 .data = &xfs_params.inherit_nodump.val,128 .maxlen = sizeof(int),129 .mode = 0644,130 .proc_handler = proc_dointvec_minmax,131 .extra1 = &xfs_params.inherit_nodump.min,132 .extra2 = &xfs_params.inherit_nodump.max133 },134 {135 .procname = "inherit_noatime",136 .data = &xfs_params.inherit_noatim.val,137 .maxlen = sizeof(int),138 .mode = 0644,139 .proc_handler = proc_dointvec_minmax,140 .extra1 = &xfs_params.inherit_noatim.min,141 .extra2 = &xfs_params.inherit_noatim.max142 },143 {144 .procname = "inherit_nosymlinks",145 .data = &xfs_params.inherit_nosym.val,146 .maxlen = sizeof(int),147 .mode = 0644,148 .proc_handler = proc_dointvec_minmax,149 .extra1 = &xfs_params.inherit_nosym.min,150 .extra2 = &xfs_params.inherit_nosym.max151 },152 {153 .procname = "rotorstep",154 .data = &xfs_params.rotorstep.val,155 .maxlen = sizeof(int),156 .mode = 0644,157 .proc_handler = proc_dointvec_minmax,158 .extra1 = &xfs_params.rotorstep.min,159 .extra2 = &xfs_params.rotorstep.max160 },161 {162 .procname = "inherit_nodefrag",163 .data = &xfs_params.inherit_nodfrg.val,164 .maxlen = sizeof(int),165 .mode = 0644,166 .proc_handler = proc_dointvec_minmax,167 .extra1 = &xfs_params.inherit_nodfrg.min,168 .extra2 = &xfs_params.inherit_nodfrg.max169 },170 {171 .procname = "filestream_centisecs",172 .data = &xfs_params.fstrm_timer.val,173 .maxlen = sizeof(int),174 .mode = 0644,175 .proc_handler = proc_dointvec_minmax,176 .extra1 = &xfs_params.fstrm_timer.min,177 .extra2 = &xfs_params.fstrm_timer.max,178 },179 {180 .procname = "speculative_prealloc_lifetime",181 .data = &xfs_params.blockgc_timer.val,182 .maxlen = sizeof(int),183 .mode = 0644,184 .proc_handler = proc_dointvec_minmax,185 .extra1 = &xfs_params.blockgc_timer.min,186 .extra2 = &xfs_params.blockgc_timer.max,187 },188 {189 .procname = "speculative_cow_prealloc_lifetime",190 .data = &xfs_params.blockgc_timer.val,191 .maxlen = sizeof(int),192 .mode = 0644,193 .proc_handler = xfs_deprecated_dointvec_minmax,194 .extra1 = &xfs_params.blockgc_timer.min,195 .extra2 = &xfs_params.blockgc_timer.max,196 },197 /* please keep this the last entry */198#ifdef CONFIG_PROC_FS199 {200 .procname = "stats_clear",201 .data = &xfs_params.stats_clear.val,202 .maxlen = sizeof(int),203 .mode = 0644,204 .proc_handler = xfs_stats_clear_proc_handler,205 .extra1 = &xfs_params.stats_clear.min,206 .extra2 = &xfs_params.stats_clear.max207 },208#endif /* CONFIG_PROC_FS */209};210 211int212xfs_sysctl_register(void)213{214 xfs_table_header = register_sysctl("fs/xfs", xfs_table);215 if (!xfs_table_header)216 return -ENOMEM;217 return 0;218}219 220void221xfs_sysctl_unregister(void)222{223 unregister_sysctl_table(xfs_table_header);224}225