linux/fs/xfs/xfs_sysctl.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2001-2005 Silicon Graphics, Inc.
   3 * All Rights Reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of the GNU General Public License as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it would be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write the Free Software Foundation,
  16 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  17 */
  18#include "xfs.h"
  19#include <linux/sysctl.h>
  20#include <linux/proc_fs.h>
  21#include "xfs_error.h"
  22#include "xfs_stats.h"
  23
  24static struct ctl_table_header *xfs_table_header;
  25
  26#ifdef CONFIG_PROC_FS
  27STATIC int
  28xfs_stats_clear_proc_handler(
  29        struct ctl_table        *ctl,
  30        int                     write,
  31        void                    __user *buffer,
  32        size_t                  *lenp,
  33        loff_t                  *ppos)
  34{
  35        int             ret, *valp = ctl->data;
  36
  37        ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
  38
  39        if (!ret && write && *valp) {
  40                xfs_stats_clearall(xfsstats.xs_stats);
  41                xfs_stats_clear = 0;
  42        }
  43
  44        return ret;
  45}
  46
  47STATIC int
  48xfs_panic_mask_proc_handler(
  49        struct ctl_table        *ctl,
  50        int                     write,
  51        void                    __user *buffer,
  52        size_t                  *lenp,
  53        loff_t                  *ppos)
  54{
  55        int             ret, *valp = ctl->data;
  56
  57        ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
  58        if (!ret && write) {
  59                xfs_panic_mask = *valp;
  60#ifdef DEBUG
  61                xfs_panic_mask |= (XFS_PTAG_SHUTDOWN_CORRUPT | XFS_PTAG_LOGRES);
  62#endif
  63        }
  64        return ret;
  65}
  66#endif /* CONFIG_PROC_FS */
  67
  68static struct ctl_table xfs_table[] = {
  69        {
  70                .procname       = "irix_sgid_inherit",
  71                .data           = &xfs_params.sgid_inherit.val,
  72                .maxlen         = sizeof(int),
  73                .mode           = 0644,
  74                .proc_handler   = proc_dointvec_minmax,
  75                .extra1         = &xfs_params.sgid_inherit.min,
  76                .extra2         = &xfs_params.sgid_inherit.max
  77        },
  78        {
  79                .procname       = "irix_symlink_mode",
  80                .data           = &xfs_params.symlink_mode.val,
  81                .maxlen         = sizeof(int),
  82                .mode           = 0644,
  83                .proc_handler   = proc_dointvec_minmax,
  84                .extra1         = &xfs_params.symlink_mode.min,
  85                .extra2         = &xfs_params.symlink_mode.max
  86        },
  87        {
  88                .procname       = "panic_mask",
  89                .data           = &xfs_params.panic_mask.val,
  90                .maxlen         = sizeof(int),
  91                .mode           = 0644,
  92                .proc_handler   = xfs_panic_mask_proc_handler,
  93                .extra1         = &xfs_params.panic_mask.min,
  94                .extra2         = &xfs_params.panic_mask.max
  95        },
  96
  97        {
  98                .procname       = "error_level",
  99                .data           = &xfs_params.error_level.val,
 100                .maxlen         = sizeof(int),
 101                .mode           = 0644,
 102                .proc_handler   = proc_dointvec_minmax,
 103                .extra1         = &xfs_params.error_level.min,
 104                .extra2         = &xfs_params.error_level.max
 105        },
 106        {
 107                .procname       = "xfssyncd_centisecs",
 108                .data           = &xfs_params.syncd_timer.val,
 109                .maxlen         = sizeof(int),
 110                .mode           = 0644,
 111                .proc_handler   = proc_dointvec_minmax,
 112                .extra1         = &xfs_params.syncd_timer.min,
 113                .extra2         = &xfs_params.syncd_timer.max
 114        },
 115        {
 116                .procname       = "inherit_sync",
 117                .data           = &xfs_params.inherit_sync.val,
 118                .maxlen         = sizeof(int),
 119                .mode           = 0644,
 120                .proc_handler   = proc_dointvec_minmax,
 121                .extra1         = &xfs_params.inherit_sync.min,
 122                .extra2         = &xfs_params.inherit_sync.max
 123        },
 124        {
 125                .procname       = "inherit_nodump",
 126                .data           = &xfs_params.inherit_nodump.val,
 127                .maxlen         = sizeof(int),
 128                .mode           = 0644,
 129                .proc_handler   = proc_dointvec_minmax,
 130                .extra1         = &xfs_params.inherit_nodump.min,
 131                .extra2         = &xfs_params.inherit_nodump.max
 132        },
 133        {
 134                .procname       = "inherit_noatime",
 135                .data           = &xfs_params.inherit_noatim.val,
 136                .maxlen         = sizeof(int),
 137                .mode           = 0644,
 138                .proc_handler   = proc_dointvec_minmax,
 139                .extra1         = &xfs_params.inherit_noatim.min,
 140                .extra2         = &xfs_params.inherit_noatim.max
 141        },
 142        {
 143                .procname       = "inherit_nosymlinks",
 144                .data           = &xfs_params.inherit_nosym.val,
 145                .maxlen         = sizeof(int),
 146                .mode           = 0644,
 147                .proc_handler   = proc_dointvec_minmax,
 148                .extra1         = &xfs_params.inherit_nosym.min,
 149                .extra2         = &xfs_params.inherit_nosym.max
 150        },
 151        {
 152                .procname       = "rotorstep",
 153                .data           = &xfs_params.rotorstep.val,
 154                .maxlen         = sizeof(int),
 155                .mode           = 0644,
 156                .proc_handler   = proc_dointvec_minmax,
 157                .extra1         = &xfs_params.rotorstep.min,
 158                .extra2         = &xfs_params.rotorstep.max
 159        },
 160        {
 161                .procname       = "inherit_nodefrag",
 162                .data           = &xfs_params.inherit_nodfrg.val,
 163                .maxlen         = sizeof(int),
 164                .mode           = 0644,
 165                .proc_handler   = proc_dointvec_minmax,
 166                .extra1         = &xfs_params.inherit_nodfrg.min,
 167                .extra2         = &xfs_params.inherit_nodfrg.max
 168        },
 169        {
 170                .procname       = "filestream_centisecs",
 171                .data           = &xfs_params.fstrm_timer.val,
 172                .maxlen         = sizeof(int),
 173                .mode           = 0644,
 174                .proc_handler   = proc_dointvec_minmax,
 175                .extra1         = &xfs_params.fstrm_timer.min,
 176                .extra2         = &xfs_params.fstrm_timer.max,
 177        },
 178        {
 179                .procname       = "speculative_prealloc_lifetime",
 180                .data           = &xfs_params.eofb_timer.val,
 181                .maxlen         = sizeof(int),
 182                .mode           = 0644,
 183                .proc_handler   = proc_dointvec_minmax,
 184                .extra1         = &xfs_params.eofb_timer.min,
 185                .extra2         = &xfs_params.eofb_timer.max,
 186        },
 187        {
 188                .procname       = "speculative_cow_prealloc_lifetime",
 189                .data           = &xfs_params.cowb_timer.val,
 190                .maxlen         = sizeof(int),
 191                .mode           = 0644,
 192                .proc_handler   = proc_dointvec_minmax,
 193                .extra1         = &xfs_params.cowb_timer.min,
 194                .extra2         = &xfs_params.cowb_timer.max,
 195        },
 196        /* please keep this the last entry */
 197#ifdef CONFIG_PROC_FS
 198        {
 199                .procname       = "stats_clear",
 200                .data           = &xfs_params.stats_clear.val,
 201                .maxlen         = sizeof(int),
 202                .mode           = 0644,
 203                .proc_handler   = xfs_stats_clear_proc_handler,
 204                .extra1         = &xfs_params.stats_clear.min,
 205                .extra2         = &xfs_params.stats_clear.max
 206        },
 207#endif /* CONFIG_PROC_FS */
 208
 209        {}
 210};
 211
 212static struct ctl_table xfs_dir_table[] = {
 213        {
 214                .procname       = "xfs",
 215                .mode           = 0555,
 216                .child          = xfs_table
 217        },
 218        {}
 219};
 220
 221static struct ctl_table xfs_root_table[] = {
 222        {
 223                .procname       = "fs",
 224                .mode           = 0555,
 225                .child          = xfs_dir_table
 226        },
 227        {}
 228};
 229
 230int
 231xfs_sysctl_register(void)
 232{
 233        xfs_table_header = register_sysctl_table(xfs_root_table);
 234        if (!xfs_table_header)
 235                return -ENOMEM;
 236        return 0;
 237}
 238
 239void
 240xfs_sysctl_unregister(void)
 241{
 242        unregister_sysctl_table(xfs_table_header);
 243}
 244