linux/fs/xfs/xfs_sysctl.c
<<
>>
Prefs
   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
  12static struct ctl_table_header *xfs_table_header;
  13
  14#ifdef CONFIG_PROC_FS
  15STATIC int
  16xfs_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
  35STATIC int
  36xfs_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
  56static 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
 200static struct ctl_table xfs_dir_table[] = {
 201        {
 202                .procname       = "xfs",
 203                .mode           = 0555,
 204                .child          = xfs_table
 205        },
 206        {}
 207};
 208
 209static struct ctl_table xfs_root_table[] = {
 210        {
 211                .procname       = "fs",
 212                .mode           = 0555,
 213                .child          = xfs_dir_table
 214        },
 215        {}
 216};
 217
 218int
 219xfs_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
 227void
 228xfs_sysctl_unregister(void)
 229{
 230        unregister_sysctl_table(xfs_table_header);
 231}
 232