10b61f8a4SDave Chinner // SPDX-License-Identifier: GPL-2.0 2c59d87c4SChristoph Hellwig /* 3c59d87c4SChristoph Hellwig * Copyright (c) 2001-2005 Silicon Graphics, Inc. 4c59d87c4SChristoph Hellwig * All Rights Reserved. 5c59d87c4SChristoph Hellwig */ 6c59d87c4SChristoph Hellwig #include "xfs.h" 7c59d87c4SChristoph Hellwig #include "xfs_error.h" 8c59d87c4SChristoph Hellwig 9c59d87c4SChristoph Hellwig static struct ctl_table_header *xfs_table_header; 10c59d87c4SChristoph Hellwig 11c59d87c4SChristoph Hellwig #ifdef CONFIG_PROC_FS 12c59d87c4SChristoph Hellwig STATIC int 13c59d87c4SChristoph Hellwig xfs_stats_clear_proc_handler( 14b2410e92SJoe Perches struct ctl_table *ctl, 15c59d87c4SChristoph Hellwig int write, 1632927393SChristoph Hellwig void *buffer, 17c59d87c4SChristoph Hellwig size_t *lenp, 18c59d87c4SChristoph Hellwig loff_t *ppos) 19c59d87c4SChristoph Hellwig { 20bb230c12SBill O'Donnell int ret, *valp = ctl->data; 21c59d87c4SChristoph Hellwig 22c59d87c4SChristoph Hellwig ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos); 23c59d87c4SChristoph Hellwig 24c59d87c4SChristoph Hellwig if (!ret && write && *valp) { 2580529c45SBill O'Donnell xfs_stats_clearall(xfsstats.xs_stats); 26c59d87c4SChristoph Hellwig xfs_stats_clear = 0; 27c59d87c4SChristoph Hellwig } 28c59d87c4SChristoph Hellwig 29c59d87c4SChristoph Hellwig return ret; 30c59d87c4SChristoph Hellwig } 31c59d87c4SChristoph Hellwig 32c59d87c4SChristoph Hellwig STATIC int 33c59d87c4SChristoph Hellwig xfs_panic_mask_proc_handler( 34b2410e92SJoe Perches struct ctl_table *ctl, 35c59d87c4SChristoph Hellwig int write, 3632927393SChristoph Hellwig void *buffer, 37c59d87c4SChristoph Hellwig size_t *lenp, 38c59d87c4SChristoph Hellwig loff_t *ppos) 39c59d87c4SChristoph Hellwig { 40c59d87c4SChristoph Hellwig int ret, *valp = ctl->data; 41c59d87c4SChristoph Hellwig 42c59d87c4SChristoph Hellwig ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos); 43c59d87c4SChristoph Hellwig if (!ret && write) { 44c59d87c4SChristoph Hellwig xfs_panic_mask = *valp; 45c59d87c4SChristoph Hellwig #ifdef DEBUG 46c59d87c4SChristoph Hellwig xfs_panic_mask |= (XFS_PTAG_SHUTDOWN_CORRUPT | XFS_PTAG_LOGRES); 47c59d87c4SChristoph Hellwig #endif 48c59d87c4SChristoph Hellwig } 49c59d87c4SChristoph Hellwig return ret; 50c59d87c4SChristoph Hellwig } 51c59d87c4SChristoph Hellwig #endif /* CONFIG_PROC_FS */ 52c59d87c4SChristoph Hellwig 53*3442de9cSPavel Reichl STATIC int 54*3442de9cSPavel Reichl xfs_deprecate_irix_sgid_inherit_proc_handler( 55*3442de9cSPavel Reichl struct ctl_table *ctl, 56*3442de9cSPavel Reichl int write, 57*3442de9cSPavel Reichl void *buffer, 58*3442de9cSPavel Reichl size_t *lenp, 59*3442de9cSPavel Reichl loff_t *ppos) 60*3442de9cSPavel Reichl { 61*3442de9cSPavel Reichl if (write) { 62*3442de9cSPavel Reichl printk_once(KERN_WARNING 63*3442de9cSPavel Reichl "XFS: " "%s sysctl option is deprecated.\n", 64*3442de9cSPavel Reichl ctl->procname); 65*3442de9cSPavel Reichl } 66*3442de9cSPavel Reichl return proc_dointvec_minmax(ctl, write, buffer, lenp, ppos); 67*3442de9cSPavel Reichl } 68*3442de9cSPavel Reichl 69*3442de9cSPavel Reichl STATIC int 70*3442de9cSPavel Reichl xfs_deprecate_irix_symlink_mode_proc_handler( 71*3442de9cSPavel Reichl struct ctl_table *ctl, 72*3442de9cSPavel Reichl int write, 73*3442de9cSPavel Reichl void *buffer, 74*3442de9cSPavel Reichl size_t *lenp, 75*3442de9cSPavel Reichl loff_t *ppos) 76*3442de9cSPavel Reichl { 77*3442de9cSPavel Reichl if (write) { 78*3442de9cSPavel Reichl printk_once(KERN_WARNING 79*3442de9cSPavel Reichl "XFS: " "%s sysctl option is deprecated.\n", 80*3442de9cSPavel Reichl ctl->procname); 81*3442de9cSPavel Reichl } 82*3442de9cSPavel Reichl return proc_dointvec_minmax(ctl, write, buffer, lenp, ppos); 83*3442de9cSPavel Reichl } 84*3442de9cSPavel Reichl 85b2410e92SJoe Perches static struct ctl_table xfs_table[] = { 86c59d87c4SChristoph Hellwig { 87c59d87c4SChristoph Hellwig .procname = "irix_sgid_inherit", 88c59d87c4SChristoph Hellwig .data = &xfs_params.sgid_inherit.val, 89c59d87c4SChristoph Hellwig .maxlen = sizeof(int), 90c59d87c4SChristoph Hellwig .mode = 0644, 91*3442de9cSPavel Reichl .proc_handler = xfs_deprecate_irix_sgid_inherit_proc_handler, 92c59d87c4SChristoph Hellwig .extra1 = &xfs_params.sgid_inherit.min, 93c59d87c4SChristoph Hellwig .extra2 = &xfs_params.sgid_inherit.max 94c59d87c4SChristoph Hellwig }, 95c59d87c4SChristoph Hellwig { 96c59d87c4SChristoph Hellwig .procname = "irix_symlink_mode", 97c59d87c4SChristoph Hellwig .data = &xfs_params.symlink_mode.val, 98c59d87c4SChristoph Hellwig .maxlen = sizeof(int), 99c59d87c4SChristoph Hellwig .mode = 0644, 100*3442de9cSPavel Reichl .proc_handler = xfs_deprecate_irix_symlink_mode_proc_handler, 101c59d87c4SChristoph Hellwig .extra1 = &xfs_params.symlink_mode.min, 102c59d87c4SChristoph Hellwig .extra2 = &xfs_params.symlink_mode.max 103c59d87c4SChristoph Hellwig }, 104c59d87c4SChristoph Hellwig { 105c59d87c4SChristoph Hellwig .procname = "panic_mask", 106c59d87c4SChristoph Hellwig .data = &xfs_params.panic_mask.val, 107c59d87c4SChristoph Hellwig .maxlen = sizeof(int), 108c59d87c4SChristoph Hellwig .mode = 0644, 109c59d87c4SChristoph Hellwig .proc_handler = xfs_panic_mask_proc_handler, 110c59d87c4SChristoph Hellwig .extra1 = &xfs_params.panic_mask.min, 111c59d87c4SChristoph Hellwig .extra2 = &xfs_params.panic_mask.max 112c59d87c4SChristoph Hellwig }, 113c59d87c4SChristoph Hellwig 114c59d87c4SChristoph Hellwig { 115c59d87c4SChristoph Hellwig .procname = "error_level", 116c59d87c4SChristoph Hellwig .data = &xfs_params.error_level.val, 117c59d87c4SChristoph Hellwig .maxlen = sizeof(int), 118c59d87c4SChristoph Hellwig .mode = 0644, 119c59d87c4SChristoph Hellwig .proc_handler = proc_dointvec_minmax, 120c59d87c4SChristoph Hellwig .extra1 = &xfs_params.error_level.min, 121c59d87c4SChristoph Hellwig .extra2 = &xfs_params.error_level.max 122c59d87c4SChristoph Hellwig }, 123c59d87c4SChristoph Hellwig { 124c59d87c4SChristoph Hellwig .procname = "xfssyncd_centisecs", 125c59d87c4SChristoph Hellwig .data = &xfs_params.syncd_timer.val, 126c59d87c4SChristoph Hellwig .maxlen = sizeof(int), 127c59d87c4SChristoph Hellwig .mode = 0644, 128c59d87c4SChristoph Hellwig .proc_handler = proc_dointvec_minmax, 129c59d87c4SChristoph Hellwig .extra1 = &xfs_params.syncd_timer.min, 130c59d87c4SChristoph Hellwig .extra2 = &xfs_params.syncd_timer.max 131c59d87c4SChristoph Hellwig }, 132c59d87c4SChristoph Hellwig { 133c59d87c4SChristoph Hellwig .procname = "inherit_sync", 134c59d87c4SChristoph Hellwig .data = &xfs_params.inherit_sync.val, 135c59d87c4SChristoph Hellwig .maxlen = sizeof(int), 136c59d87c4SChristoph Hellwig .mode = 0644, 137c59d87c4SChristoph Hellwig .proc_handler = proc_dointvec_minmax, 138c59d87c4SChristoph Hellwig .extra1 = &xfs_params.inherit_sync.min, 139c59d87c4SChristoph Hellwig .extra2 = &xfs_params.inherit_sync.max 140c59d87c4SChristoph Hellwig }, 141c59d87c4SChristoph Hellwig { 142c59d87c4SChristoph Hellwig .procname = "inherit_nodump", 143c59d87c4SChristoph Hellwig .data = &xfs_params.inherit_nodump.val, 144c59d87c4SChristoph Hellwig .maxlen = sizeof(int), 145c59d87c4SChristoph Hellwig .mode = 0644, 146c59d87c4SChristoph Hellwig .proc_handler = proc_dointvec_minmax, 147c59d87c4SChristoph Hellwig .extra1 = &xfs_params.inherit_nodump.min, 148c59d87c4SChristoph Hellwig .extra2 = &xfs_params.inherit_nodump.max 149c59d87c4SChristoph Hellwig }, 150c59d87c4SChristoph Hellwig { 151c59d87c4SChristoph Hellwig .procname = "inherit_noatime", 152c59d87c4SChristoph Hellwig .data = &xfs_params.inherit_noatim.val, 153c59d87c4SChristoph Hellwig .maxlen = sizeof(int), 154c59d87c4SChristoph Hellwig .mode = 0644, 155c59d87c4SChristoph Hellwig .proc_handler = proc_dointvec_minmax, 156c59d87c4SChristoph Hellwig .extra1 = &xfs_params.inherit_noatim.min, 157c59d87c4SChristoph Hellwig .extra2 = &xfs_params.inherit_noatim.max 158c59d87c4SChristoph Hellwig }, 159c59d87c4SChristoph Hellwig { 160c59d87c4SChristoph Hellwig .procname = "inherit_nosymlinks", 161c59d87c4SChristoph Hellwig .data = &xfs_params.inherit_nosym.val, 162c59d87c4SChristoph Hellwig .maxlen = sizeof(int), 163c59d87c4SChristoph Hellwig .mode = 0644, 164c59d87c4SChristoph Hellwig .proc_handler = proc_dointvec_minmax, 165c59d87c4SChristoph Hellwig .extra1 = &xfs_params.inherit_nosym.min, 166c59d87c4SChristoph Hellwig .extra2 = &xfs_params.inherit_nosym.max 167c59d87c4SChristoph Hellwig }, 168c59d87c4SChristoph Hellwig { 169c59d87c4SChristoph Hellwig .procname = "rotorstep", 170c59d87c4SChristoph Hellwig .data = &xfs_params.rotorstep.val, 171c59d87c4SChristoph Hellwig .maxlen = sizeof(int), 172c59d87c4SChristoph Hellwig .mode = 0644, 173c59d87c4SChristoph Hellwig .proc_handler = proc_dointvec_minmax, 174c59d87c4SChristoph Hellwig .extra1 = &xfs_params.rotorstep.min, 175c59d87c4SChristoph Hellwig .extra2 = &xfs_params.rotorstep.max 176c59d87c4SChristoph Hellwig }, 177c59d87c4SChristoph Hellwig { 178c59d87c4SChristoph Hellwig .procname = "inherit_nodefrag", 179c59d87c4SChristoph Hellwig .data = &xfs_params.inherit_nodfrg.val, 180c59d87c4SChristoph Hellwig .maxlen = sizeof(int), 181c59d87c4SChristoph Hellwig .mode = 0644, 182c59d87c4SChristoph Hellwig .proc_handler = proc_dointvec_minmax, 183c59d87c4SChristoph Hellwig .extra1 = &xfs_params.inherit_nodfrg.min, 184c59d87c4SChristoph Hellwig .extra2 = &xfs_params.inherit_nodfrg.max 185c59d87c4SChristoph Hellwig }, 186c59d87c4SChristoph Hellwig { 187c59d87c4SChristoph Hellwig .procname = "filestream_centisecs", 188c59d87c4SChristoph Hellwig .data = &xfs_params.fstrm_timer.val, 189c59d87c4SChristoph Hellwig .maxlen = sizeof(int), 190c59d87c4SChristoph Hellwig .mode = 0644, 191c59d87c4SChristoph Hellwig .proc_handler = proc_dointvec_minmax, 192c59d87c4SChristoph Hellwig .extra1 = &xfs_params.fstrm_timer.min, 193c59d87c4SChristoph Hellwig .extra2 = &xfs_params.fstrm_timer.max, 194c59d87c4SChristoph Hellwig }, 195579b62faSBrian Foster { 196579b62faSBrian Foster .procname = "speculative_prealloc_lifetime", 197579b62faSBrian Foster .data = &xfs_params.eofb_timer.val, 198579b62faSBrian Foster .maxlen = sizeof(int), 199579b62faSBrian Foster .mode = 0644, 200579b62faSBrian Foster .proc_handler = proc_dointvec_minmax, 201579b62faSBrian Foster .extra1 = &xfs_params.eofb_timer.min, 202579b62faSBrian Foster .extra2 = &xfs_params.eofb_timer.max, 203579b62faSBrian Foster }, 20483104d44SDarrick J. Wong { 20583104d44SDarrick J. Wong .procname = "speculative_cow_prealloc_lifetime", 20683104d44SDarrick J. Wong .data = &xfs_params.cowb_timer.val, 20783104d44SDarrick J. Wong .maxlen = sizeof(int), 20883104d44SDarrick J. Wong .mode = 0644, 20983104d44SDarrick J. Wong .proc_handler = proc_dointvec_minmax, 21083104d44SDarrick J. Wong .extra1 = &xfs_params.cowb_timer.min, 21183104d44SDarrick J. Wong .extra2 = &xfs_params.cowb_timer.max, 21283104d44SDarrick J. Wong }, 213c59d87c4SChristoph Hellwig /* please keep this the last entry */ 214c59d87c4SChristoph Hellwig #ifdef CONFIG_PROC_FS 215c59d87c4SChristoph Hellwig { 216c59d87c4SChristoph Hellwig .procname = "stats_clear", 217c59d87c4SChristoph Hellwig .data = &xfs_params.stats_clear.val, 218c59d87c4SChristoph Hellwig .maxlen = sizeof(int), 219c59d87c4SChristoph Hellwig .mode = 0644, 220c59d87c4SChristoph Hellwig .proc_handler = xfs_stats_clear_proc_handler, 221c59d87c4SChristoph Hellwig .extra1 = &xfs_params.stats_clear.min, 222c59d87c4SChristoph Hellwig .extra2 = &xfs_params.stats_clear.max 223c59d87c4SChristoph Hellwig }, 224c59d87c4SChristoph Hellwig #endif /* CONFIG_PROC_FS */ 225c59d87c4SChristoph Hellwig 226c59d87c4SChristoph Hellwig {} 227c59d87c4SChristoph Hellwig }; 228c59d87c4SChristoph Hellwig 229b2410e92SJoe Perches static struct ctl_table xfs_dir_table[] = { 230c59d87c4SChristoph Hellwig { 231c59d87c4SChristoph Hellwig .procname = "xfs", 232c59d87c4SChristoph Hellwig .mode = 0555, 233c59d87c4SChristoph Hellwig .child = xfs_table 234c59d87c4SChristoph Hellwig }, 235c59d87c4SChristoph Hellwig {} 236c59d87c4SChristoph Hellwig }; 237c59d87c4SChristoph Hellwig 238b2410e92SJoe Perches static struct ctl_table xfs_root_table[] = { 239c59d87c4SChristoph Hellwig { 240c59d87c4SChristoph Hellwig .procname = "fs", 241c59d87c4SChristoph Hellwig .mode = 0555, 242c59d87c4SChristoph Hellwig .child = xfs_dir_table 243c59d87c4SChristoph Hellwig }, 244c59d87c4SChristoph Hellwig {} 245c59d87c4SChristoph Hellwig }; 246c59d87c4SChristoph Hellwig 247c59d87c4SChristoph Hellwig int 248c59d87c4SChristoph Hellwig xfs_sysctl_register(void) 249c59d87c4SChristoph Hellwig { 250c59d87c4SChristoph Hellwig xfs_table_header = register_sysctl_table(xfs_root_table); 251c59d87c4SChristoph Hellwig if (!xfs_table_header) 252c59d87c4SChristoph Hellwig return -ENOMEM; 253c59d87c4SChristoph Hellwig return 0; 254c59d87c4SChristoph Hellwig } 255c59d87c4SChristoph Hellwig 256c59d87c4SChristoph Hellwig void 257c59d87c4SChristoph Hellwig xfs_sysctl_unregister(void) 258c59d87c4SChristoph Hellwig { 259c59d87c4SChristoph Hellwig unregister_sysctl_table(xfs_table_header); 260c59d87c4SChristoph Hellwig } 261