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 "xfs_error.h"
   8
   9static struct ctl_table_header *xfs_table_header;
  10
  11#ifdef CONFIG_PROC_FS
  12STATIC int
  13xfs_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
  32STATIC int
  33xfs_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
  53STATIC int
  54xfs_deprecated_dointvec_minmax(
  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_ratelimited(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
  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.max
  78        },
  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.max
  87        },
  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.max
  96        },
  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.max
 106        },
 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.max
 115        },
 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.max
 124        },
 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.max
 133        },
 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.max
 142        },
 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.max
 151        },
 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.max
 160        },
 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.max
 169        },
 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_FS
 199        {
 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.max
 207        },
 208#endif /* CONFIG_PROC_FS */
 209
 210        {}
 211};
 212
 213static struct ctl_table xfs_dir_table[] = {
 214        {
 215                .procname       = "xfs",
 216                .mode           = 0555,
 217                .child          = xfs_table
 218        },
 219        {}
 220};
 221
 222static struct ctl_table xfs_root_table[] = {
 223        {
 224                .procname       = "fs",
 225                .mode           = 0555,
 226                .child          = xfs_dir_table
 227        },
 228        {}
 229};
 230
 231int
 232xfs_sysctl_register(void)
 233{
 234        xfs_table_header = register_sysctl_table(xfs_root_table);
 235        if (!xfs_table_header)
 236                return -ENOMEM;
 237        return 0;
 238}
 239
 240void
 241xfs_sysctl_unregister(void)
 242{
 243        unregister_sysctl_table(xfs_table_header);
 244}
 245