Re: [PATCH 08/11] staging: lustre: obdclass: move linux/linux-foo.c to foo.c
From: James Simmons
Date: Wed Jun 13 2018 - 22:40:22 EST
> As lustre is now linux-only, having this linux sub-directory
> with files named "linux-something" is just noise. Move them
> to a more friendly name.
Reviewed-by: James Simmons <jsimmons@xxxxxxxxxxxxx>
> Signed-off-by: NeilBrown <neilb@xxxxxxxx>
> ---
> drivers/staging/lustre/lustre/obdclass/Makefile | 2
> .../lustre/lustre/obdclass/linux/linux-module.c | 514 --------------------
> .../lustre/lustre/obdclass/linux/linux-sysctl.c | 162 ------
> drivers/staging/lustre/lustre/obdclass/module.c | 514 ++++++++++++++++++++
> drivers/staging/lustre/lustre/obdclass/sysctl.c | 162 ++++++
> 5 files changed, 677 insertions(+), 677 deletions(-)
> delete mode 100644 drivers/staging/lustre/lustre/obdclass/linux/linux-module.c
> delete mode 100644 drivers/staging/lustre/lustre/obdclass/linux/linux-sysctl.c
> create mode 100644 drivers/staging/lustre/lustre/obdclass/module.c
> create mode 100644 drivers/staging/lustre/lustre/obdclass/sysctl.c
>
> diff --git a/drivers/staging/lustre/lustre/obdclass/Makefile b/drivers/staging/lustre/lustre/obdclass/Makefile
> index e3fa9acff4c4..e36ba2167d10 100644
> --- a/drivers/staging/lustre/lustre/obdclass/Makefile
> +++ b/drivers/staging/lustre/lustre/obdclass/Makefile
> @@ -4,7 +4,7 @@ subdir-ccflags-y += -I$(srctree)/drivers/staging/lustre/lustre/include
>
> obj-$(CONFIG_LUSTRE_FS) += obdclass.o
>
> -obdclass-y := linux/linux-module.o linux/linux-sysctl.o \
> +obdclass-y := module.o sysctl.o \
> llog.o llog_cat.o llog_obd.o llog_swab.o class_obd.o debug.o \
> genops.o uuid.o lprocfs_status.o lprocfs_counters.o \
> lustre_handles.o lustre_peer.o statfs_pack.o linkea.o \
> diff --git a/drivers/staging/lustre/lustre/obdclass/linux/linux-module.c b/drivers/staging/lustre/lustre/obdclass/linux/linux-module.c
> deleted file mode 100644
> index 9c800580053b..000000000000
> --- a/drivers/staging/lustre/lustre/obdclass/linux/linux-module.c
> +++ /dev/null
> @@ -1,514 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * GPL HEADER START
> - *
> - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2 only,
> - * as published by the Free Software Foundation.
> - *
> - * This program is distributed in the hope that it will be useful, but
> - * WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> - * General Public License version 2 for more details (a copy is included
> - * in the LICENSE file that accompanied this code).
> - *
> - * You should have received a copy of the GNU General Public License
> - * version 2 along with this program; If not, see
> - * http://www.gnu.org/licenses/gpl-2.0.html
> - *
> - * GPL HEADER END
> - */
> -/*
> - * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
> - * Use is subject to license terms.
> - *
> - * Copyright (c) 2011, 2012, Intel Corporation.
> - */
> -/*
> - * This file is part of Lustre, http://www.lustre.org/
> - * Lustre is a trademark of Sun Microsystems, Inc.
> - *
> - * lustre/obdclass/linux/linux-module.c
> - *
> - * Object Devices Class Driver
> - * These are the only exported functions, they provide some generic
> - * infrastructure for managing object devices
> - */
> -
> -#define DEBUG_SUBSYSTEM S_CLASS
> -
> -#include <linux/module.h>
> -#include <linux/errno.h>
> -#include <linux/kernel.h>
> -#include <linux/sched.h>
> -#include <linux/lp.h>
> -#include <linux/slab.h>
> -#include <linux/ioport.h>
> -#include <linux/fcntl.h>
> -#include <linux/delay.h>
> -#include <linux/skbuff.h>
> -#include <linux/fs.h>
> -#include <linux/poll.h>
> -#include <linux/list.h>
> -#include <linux/highmem.h>
> -#include <linux/io.h>
> -#include <asm/ioctls.h>
> -#include <linux/uaccess.h>
> -#include <linux/miscdevice.h>
> -#include <linux/seq_file.h>
> -#include <linux/kobject.h>
> -
> -#include <uapi/linux/lnet/lnetctl.h>
> -#include <obd_support.h>
> -#include <obd_class.h>
> -#include <lprocfs_status.h>
> -#include <uapi/linux/lustre/lustre_ioctl.h>
> -#include <uapi/linux/lustre/lustre_ver.h>
> -
> -#define OBD_MAX_IOCTL_BUFFER 8192
> -
> -static int obd_ioctl_is_invalid(struct obd_ioctl_data *data)
> -{
> - if (data->ioc_len > BIT(30)) {
> - CERROR("OBD ioctl: ioc_len larger than 1<<30\n");
> - return 1;
> - }
> -
> - if (data->ioc_inllen1 > BIT(30)) {
> - CERROR("OBD ioctl: ioc_inllen1 larger than 1<<30\n");
> - return 1;
> - }
> -
> - if (data->ioc_inllen2 > BIT(30)) {
> - CERROR("OBD ioctl: ioc_inllen2 larger than 1<<30\n");
> - return 1;
> - }
> -
> - if (data->ioc_inllen3 > BIT(30)) {
> - CERROR("OBD ioctl: ioc_inllen3 larger than 1<<30\n");
> - return 1;
> - }
> -
> - if (data->ioc_inllen4 > BIT(30)) {
> - CERROR("OBD ioctl: ioc_inllen4 larger than 1<<30\n");
> - return 1;
> - }
> -
> - if (data->ioc_inlbuf1 && data->ioc_inllen1 == 0) {
> - CERROR("OBD ioctl: inlbuf1 pointer but 0 length\n");
> - return 1;
> - }
> -
> - if (data->ioc_inlbuf2 && data->ioc_inllen2 == 0) {
> - CERROR("OBD ioctl: inlbuf2 pointer but 0 length\n");
> - return 1;
> - }
> -
> - if (data->ioc_inlbuf3 && data->ioc_inllen3 == 0) {
> - CERROR("OBD ioctl: inlbuf3 pointer but 0 length\n");
> - return 1;
> - }
> -
> - if (data->ioc_inlbuf4 && data->ioc_inllen4 == 0) {
> - CERROR("OBD ioctl: inlbuf4 pointer but 0 length\n");
> - return 1;
> - }
> -
> - if (data->ioc_pbuf1 && data->ioc_plen1 == 0) {
> - CERROR("OBD ioctl: pbuf1 pointer but 0 length\n");
> - return 1;
> - }
> -
> - if (data->ioc_pbuf2 && data->ioc_plen2 == 0) {
> - CERROR("OBD ioctl: pbuf2 pointer but 0 length\n");
> - return 1;
> - }
> -
> - if (!data->ioc_pbuf1 && data->ioc_plen1 != 0) {
> - CERROR("OBD ioctl: plen1 set but NULL pointer\n");
> - return 1;
> - }
> -
> - if (!data->ioc_pbuf2 && data->ioc_plen2 != 0) {
> - CERROR("OBD ioctl: plen2 set but NULL pointer\n");
> - return 1;
> - }
> -
> - if (obd_ioctl_packlen(data) > data->ioc_len) {
> - CERROR("OBD ioctl: packlen exceeds ioc_len (%d > %d)\n",
> - obd_ioctl_packlen(data), data->ioc_len);
> - return 1;
> - }
> -
> - return 0;
> -}
> -
> -/* buffer MUST be at least the size of obd_ioctl_hdr */
> -int obd_ioctl_getdata(char **buf, int *len, void __user *arg)
> -{
> - struct obd_ioctl_hdr hdr;
> - struct obd_ioctl_data *data;
> - int err;
> - int offset = 0;
> -
> - if (copy_from_user(&hdr, arg, sizeof(hdr)))
> - return -EFAULT;
> -
> - if (hdr.ioc_version != OBD_IOCTL_VERSION) {
> - CERROR("Version mismatch kernel (%x) vs application (%x)\n",
> - OBD_IOCTL_VERSION, hdr.ioc_version);
> - return -EINVAL;
> - }
> -
> - if (hdr.ioc_len > OBD_MAX_IOCTL_BUFFER) {
> - CERROR("User buffer len %d exceeds %d max buffer\n",
> - hdr.ioc_len, OBD_MAX_IOCTL_BUFFER);
> - return -EINVAL;
> - }
> -
> - if (hdr.ioc_len < sizeof(struct obd_ioctl_data)) {
> - CERROR("User buffer too small for ioctl (%d)\n", hdr.ioc_len);
> - return -EINVAL;
> - }
> -
> - /* When there are lots of processes calling vmalloc on multi-core
> - * system, the high lock contention will hurt performance badly,
> - * obdfilter-survey is an example, which relies on ioctl. So we'd
> - * better avoid vmalloc on ioctl path. LU-66
> - */
> - *buf = kvzalloc(hdr.ioc_len, GFP_KERNEL);
> - if (!*buf) {
> - CERROR("Cannot allocate control buffer of len %d\n",
> - hdr.ioc_len);
> - return -EINVAL;
> - }
> - *len = hdr.ioc_len;
> - data = (struct obd_ioctl_data *)*buf;
> -
> - if (copy_from_user(*buf, arg, hdr.ioc_len)) {
> - err = -EFAULT;
> - goto free_buf;
> - }
> - if (hdr.ioc_len != data->ioc_len) {
> - err = -EINVAL;
> - goto free_buf;
> - }
> -
> - if (obd_ioctl_is_invalid(data)) {
> - CERROR("ioctl not correctly formatted\n");
> - err = -EINVAL;
> - goto free_buf;
> - }
> -
> - if (data->ioc_inllen1) {
> - data->ioc_inlbuf1 = &data->ioc_bulk[0];
> - offset += cfs_size_round(data->ioc_inllen1);
> - }
> -
> - if (data->ioc_inllen2) {
> - data->ioc_inlbuf2 = &data->ioc_bulk[0] + offset;
> - offset += cfs_size_round(data->ioc_inllen2);
> - }
> -
> - if (data->ioc_inllen3) {
> - data->ioc_inlbuf3 = &data->ioc_bulk[0] + offset;
> - offset += cfs_size_round(data->ioc_inllen3);
> - }
> -
> - if (data->ioc_inllen4)
> - data->ioc_inlbuf4 = &data->ioc_bulk[0] + offset;
> -
> - return 0;
> -
> -free_buf:
> - kvfree(*buf);
> - return err;
> -}
> -EXPORT_SYMBOL(obd_ioctl_getdata);
> -
> -/* opening /dev/obd */
> -static int obd_class_open(struct inode *inode, struct file *file)
> -{
> - try_module_get(THIS_MODULE);
> - return 0;
> -}
> -
> -/* closing /dev/obd */
> -static int obd_class_release(struct inode *inode, struct file *file)
> -{
> - module_put(THIS_MODULE);
> - return 0;
> -}
> -
> -/* to control /dev/obd */
> -static long obd_class_ioctl(struct file *filp, unsigned int cmd,
> - unsigned long arg)
> -{
> - int err = 0;
> -
> - /* Allow non-root access for OBD_IOC_PING_TARGET - used by lfs check */
> - if (!capable(CAP_SYS_ADMIN) && (cmd != OBD_IOC_PING_TARGET))
> - return err = -EACCES;
> - if ((cmd & 0xffffff00) == ((int)'T') << 8) /* ignore all tty ioctls */
> - return err = -ENOTTY;
> -
> - err = class_handle_ioctl(cmd, (unsigned long)arg);
> -
> - return err;
> -}
> -
> -/* declare character device */
> -static const struct file_operations obd_psdev_fops = {
> - .owner = THIS_MODULE,
> - .unlocked_ioctl = obd_class_ioctl, /* unlocked_ioctl */
> - .open = obd_class_open, /* open */
> - .release = obd_class_release, /* release */
> -};
> -
> -/* modules setup */
> -struct miscdevice obd_psdev = {
> - .minor = MISC_DYNAMIC_MINOR,
> - .name = OBD_DEV_NAME,
> - .fops = &obd_psdev_fops,
> -};
> -
> -static ssize_t version_show(struct kobject *kobj, struct attribute *attr,
> - char *buf)
> -{
> - return sprintf(buf, "%s\n", LUSTRE_VERSION_STRING);
> -}
> -
> -static ssize_t pinger_show(struct kobject *kobj, struct attribute *attr,
> - char *buf)
> -{
> - return sprintf(buf, "%s\n", "on");
> -}
> -
> -static ssize_t
> -health_check_show(struct kobject *kobj, struct attribute *attr, char *buf)
> -{
> - bool healthy = true;
> - int i;
> - size_t len = 0;
> -
> - if (libcfs_catastrophe)
> - return sprintf(buf, "LBUG\n");
> -
> - read_lock(&obd_dev_lock);
> - for (i = 0; i < class_devno_max(); i++) {
> - struct obd_device *obd;
> -
> - obd = class_num2obd(i);
> - if (!obd || !obd->obd_attached || !obd->obd_set_up)
> - continue;
> -
> - LASSERT(obd->obd_magic == OBD_DEVICE_MAGIC);
> - if (obd->obd_stopping)
> - continue;
> -
> - class_incref(obd, __func__, current);
> - read_unlock(&obd_dev_lock);
> -
> - if (obd_health_check(NULL, obd))
> - healthy = false;
> - class_decref(obd, __func__, current);
> - read_lock(&obd_dev_lock);
> - }
> - read_unlock(&obd_dev_lock);
> -
> - if (healthy)
> - len = sprintf(buf, "healthy\n");
> - else
> - len = sprintf(buf, "NOT HEALTHY\n");
> -
> - return len;
> -}
> -
> -static ssize_t jobid_var_show(struct kobject *kobj, struct attribute *attr,
> - char *buf)
> -{
> - return snprintf(buf, PAGE_SIZE, "%s\n", obd_jobid_var);
> -}
> -
> -static ssize_t jobid_var_store(struct kobject *kobj, struct attribute *attr,
> - const char *buffer,
> - size_t count)
> -{
> - if (!count || count > JOBSTATS_JOBID_VAR_MAX_LEN)
> - return -EINVAL;
> -
> - memset(obd_jobid_var, 0, JOBSTATS_JOBID_VAR_MAX_LEN + 1);
> -
> - memcpy(obd_jobid_var, buffer, count);
> -
> - /* Trim the trailing '\n' if any */
> - if (obd_jobid_var[count - 1] == '\n')
> - obd_jobid_var[count - 1] = 0;
> -
> - return count;
> -}
> -
> -static ssize_t jobid_name_show(struct kobject *kobj, struct attribute *attr,
> - char *buf)
> -{
> - return snprintf(buf, PAGE_SIZE, "%s\n", obd_jobid_node);
> -}
> -
> -static ssize_t jobid_name_store(struct kobject *kobj, struct attribute *attr,
> - const char *buffer,
> - size_t count)
> -{
> - if (!count || count > LUSTRE_JOBID_SIZE)
> - return -EINVAL;
> -
> - memcpy(obd_jobid_node, buffer, count);
> -
> - obd_jobid_node[count] = 0;
> -
> - /* Trim the trailing '\n' if any */
> - if (obd_jobid_node[count - 1] == '\n')
> - obd_jobid_node[count - 1] = 0;
> -
> - return count;
> -}
> -
> -/* Root for /sys/kernel/debug/lustre */
> -struct dentry *debugfs_lustre_root;
> -EXPORT_SYMBOL_GPL(debugfs_lustre_root);
> -
> -LUSTRE_RO_ATTR(version);
> -LUSTRE_RO_ATTR(pinger);
> -LUSTRE_RO_ATTR(health_check);
> -LUSTRE_RW_ATTR(jobid_var);
> -LUSTRE_RW_ATTR(jobid_name);
> -
> -static struct attribute *lustre_attrs[] = {
> - &lustre_attr_version.attr,
> - &lustre_attr_pinger.attr,
> - &lustre_attr_health_check.attr,
> - &lustre_attr_jobid_name.attr,
> - &lustre_attr_jobid_var.attr,
> - NULL,
> -};
> -
> -static void *obd_device_list_seq_start(struct seq_file *p, loff_t *pos)
> -{
> - if (*pos >= class_devno_max())
> - return NULL;
> -
> - return pos;
> -}
> -
> -static void obd_device_list_seq_stop(struct seq_file *p, void *v)
> -{
> -}
> -
> -static void *obd_device_list_seq_next(struct seq_file *p, void *v, loff_t *pos)
> -{
> - ++*pos;
> - if (*pos >= class_devno_max())
> - return NULL;
> -
> - return pos;
> -}
> -
> -static int obd_device_list_seq_show(struct seq_file *p, void *v)
> -{
> - loff_t index = *(loff_t *)v;
> - struct obd_device *obd = class_num2obd((int)index);
> - char *status;
> -
> - if (!obd)
> - return 0;
> -
> - LASSERT(obd->obd_magic == OBD_DEVICE_MAGIC);
> - if (obd->obd_stopping)
> - status = "ST";
> - else if (obd->obd_inactive)
> - status = "IN";
> - else if (obd->obd_set_up)
> - status = "UP";
> - else if (obd->obd_attached)
> - status = "AT";
> - else
> - status = "--";
> -
> - seq_printf(p, "%3d %s %s %s %s %d\n",
> - (int)index, status, obd->obd_type->typ_name,
> - obd->obd_name, obd->obd_uuid.uuid,
> - atomic_read(&obd->obd_refcount));
> - return 0;
> -}
> -
> -static const struct seq_operations obd_device_list_sops = {
> - .start = obd_device_list_seq_start,
> - .stop = obd_device_list_seq_stop,
> - .next = obd_device_list_seq_next,
> - .show = obd_device_list_seq_show,
> -};
> -
> -static int obd_device_list_open(struct inode *inode, struct file *file)
> -{
> - struct seq_file *seq;
> - int rc = seq_open(file, &obd_device_list_sops);
> -
> - if (rc)
> - return rc;
> -
> - seq = file->private_data;
> - seq->private = inode->i_private;
> -
> - return 0;
> -}
> -
> -static const struct file_operations obd_device_list_fops = {
> - .owner = THIS_MODULE,
> - .open = obd_device_list_open,
> - .read = seq_read,
> - .llseek = seq_lseek,
> - .release = seq_release,
> -};
> -
> -struct kobject *lustre_kobj;
> -EXPORT_SYMBOL_GPL(lustre_kobj);
> -
> -static const struct attribute_group lustre_attr_group = {
> - .attrs = lustre_attrs,
> -};
> -
> -int class_procfs_init(void)
> -{
> - int rc = -ENOMEM;
> -
> - lustre_kobj = kobject_create_and_add("lustre", fs_kobj);
> - if (!lustre_kobj)
> - goto out;
> -
> - /* Create the files associated with this kobject */
> - rc = sysfs_create_group(lustre_kobj, &lustre_attr_group);
> - if (rc) {
> - kobject_put(lustre_kobj);
> - goto out;
> - }
> -
> - debugfs_lustre_root = debugfs_create_dir("lustre", NULL);
> -
> - debugfs_create_file("devices", 0444, debugfs_lustre_root, NULL,
> - &obd_device_list_fops);
> -out:
> - return rc;
> -}
> -
> -int class_procfs_clean(void)
> -{
> - debugfs_remove_recursive(debugfs_lustre_root);
> -
> - debugfs_lustre_root = NULL;
> -
> - sysfs_remove_group(lustre_kobj, &lustre_attr_group);
> - kobject_put(lustre_kobj);
> -
> - return 0;
> -}
> diff --git a/drivers/staging/lustre/lustre/obdclass/linux/linux-sysctl.c b/drivers/staging/lustre/lustre/obdclass/linux/linux-sysctl.c
> deleted file mode 100644
> index e5e8687784ee..000000000000
> --- a/drivers/staging/lustre/lustre/obdclass/linux/linux-sysctl.c
> +++ /dev/null
> @@ -1,162 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * GPL HEADER START
> - *
> - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2 only,
> - * as published by the Free Software Foundation.
> - *
> - * This program is distributed in the hope that it will be useful, but
> - * WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> - * General Public License version 2 for more details (a copy is included
> - * in the LICENSE file that accompanied this code).
> - *
> - * You should have received a copy of the GNU General Public License
> - * version 2 along with this program; If not, see
> - * http://www.gnu.org/licenses/gpl-2.0.html
> - *
> - * GPL HEADER END
> - */
> -/*
> - * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
> - * Use is subject to license terms.
> - *
> - * Copyright (c) 2011, 2015, Intel Corporation.
> - */
> -/*
> - * This file is part of Lustre, http://www.lustre.org/
> - * Lustre is a trademark of Sun Microsystems, Inc.
> - */
> -
> -#include <linux/module.h>
> -#include <linux/sysctl.h>
> -#include <linux/sched.h>
> -#include <linux/mm.h>
> -#include <linux/slab.h>
> -#include <linux/stat.h>
> -#include <linux/ctype.h>
> -#include <linux/bitops.h>
> -#include <linux/uaccess.h>
> -#include <linux/utsname.h>
> -
> -#define DEBUG_SUBSYSTEM S_CLASS
> -
> -#include <obd_support.h>
> -#include <lprocfs_status.h>
> -#include <obd_class.h>
> -
> -struct static_lustre_uintvalue_attr {
> - struct {
> - struct attribute attr;
> - ssize_t (*show)(struct kobject *kobj, struct attribute *attr,
> - char *buf);
> - ssize_t (*store)(struct kobject *kobj, struct attribute *attr,
> - const char *buf, size_t len);
> - } u;
> - int *value;
> -};
> -
> -static ssize_t static_uintvalue_show(struct kobject *kobj,
> - struct attribute *attr,
> - char *buf)
> -{
> - struct static_lustre_uintvalue_attr *lattr = (void *)attr;
> -
> - return sprintf(buf, "%d\n", *lattr->value);
> -}
> -
> -static ssize_t static_uintvalue_store(struct kobject *kobj,
> - struct attribute *attr,
> - const char *buffer, size_t count)
> -{
> - struct static_lustre_uintvalue_attr *lattr = (void *)attr;
> - int rc;
> - unsigned int val;
> -
> - rc = kstrtouint(buffer, 10, &val);
> - if (rc)
> - return rc;
> -
> - *lattr->value = val;
> -
> - return count;
> -}
> -
> -#define LUSTRE_STATIC_UINT_ATTR(name, value) \
> -static struct static_lustre_uintvalue_attr lustre_sattr_##name = \
> - {__ATTR(name, 0644, \
> - static_uintvalue_show, \
> - static_uintvalue_store),\
> - value }
> -
> -LUSTRE_STATIC_UINT_ATTR(timeout, &obd_timeout);
> -
> -static ssize_t max_dirty_mb_show(struct kobject *kobj, struct attribute *attr,
> - char *buf)
> -{
> - return sprintf(buf, "%lu\n",
> - obd_max_dirty_pages / (1 << (20 - PAGE_SHIFT)));
> -}
> -
> -static ssize_t max_dirty_mb_store(struct kobject *kobj, struct attribute *attr,
> - const char *buffer, size_t count)
> -{
> - int rc;
> - unsigned long val;
> -
> - rc = kstrtoul(buffer, 10, &val);
> - if (rc)
> - return rc;
> -
> - val *= 1 << (20 - PAGE_SHIFT); /* convert to pages */
> -
> - if (val > ((totalram_pages / 10) * 9)) {
> - /* Somebody wants to assign too much memory to dirty pages */
> - return -EINVAL;
> - }
> -
> - if (val < 4 << (20 - PAGE_SHIFT)) {
> - /* Less than 4 Mb for dirty cache is also bad */
> - return -EINVAL;
> - }
> -
> - obd_max_dirty_pages = val;
> -
> - return count;
> -}
> -LUSTRE_RW_ATTR(max_dirty_mb);
> -
> -LUSTRE_STATIC_UINT_ATTR(debug_peer_on_timeout, &obd_debug_peer_on_timeout);
> -LUSTRE_STATIC_UINT_ATTR(dump_on_timeout, &obd_dump_on_timeout);
> -LUSTRE_STATIC_UINT_ATTR(dump_on_eviction, &obd_dump_on_eviction);
> -LUSTRE_STATIC_UINT_ATTR(at_min, &at_min);
> -LUSTRE_STATIC_UINT_ATTR(at_max, &at_max);
> -LUSTRE_STATIC_UINT_ATTR(at_extra, &at_extra);
> -LUSTRE_STATIC_UINT_ATTR(at_early_margin, &at_early_margin);
> -LUSTRE_STATIC_UINT_ATTR(at_history, &at_history);
> -
> -static struct attribute *lustre_attrs[] = {
> - &lustre_sattr_timeout.u.attr,
> - &lustre_attr_max_dirty_mb.attr,
> - &lustre_sattr_debug_peer_on_timeout.u.attr,
> - &lustre_sattr_dump_on_timeout.u.attr,
> - &lustre_sattr_dump_on_eviction.u.attr,
> - &lustre_sattr_at_min.u.attr,
> - &lustre_sattr_at_max.u.attr,
> - &lustre_sattr_at_extra.u.attr,
> - &lustre_sattr_at_early_margin.u.attr,
> - &lustre_sattr_at_history.u.attr,
> - NULL,
> -};
> -
> -static const struct attribute_group lustre_attr_group = {
> - .attrs = lustre_attrs,
> -};
> -
> -int obd_sysctl_init(void)
> -{
> - return sysfs_create_group(lustre_kobj, &lustre_attr_group);
> -}
> diff --git a/drivers/staging/lustre/lustre/obdclass/module.c b/drivers/staging/lustre/lustre/obdclass/module.c
> new file mode 100644
> index 000000000000..9c800580053b
> --- /dev/null
> +++ b/drivers/staging/lustre/lustre/obdclass/module.c
> @@ -0,0 +1,514 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * GPL HEADER START
> + *
> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 only,
> + * as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * General Public License version 2 for more details (a copy is included
> + * in the LICENSE file that accompanied this code).
> + *
> + * You should have received a copy of the GNU General Public License
> + * version 2 along with this program; If not, see
> + * http://www.gnu.org/licenses/gpl-2.0.html
> + *
> + * GPL HEADER END
> + */
> +/*
> + * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
> + * Use is subject to license terms.
> + *
> + * Copyright (c) 2011, 2012, Intel Corporation.
> + */
> +/*
> + * This file is part of Lustre, http://www.lustre.org/
> + * Lustre is a trademark of Sun Microsystems, Inc.
> + *
> + * lustre/obdclass/linux/linux-module.c
> + *
> + * Object Devices Class Driver
> + * These are the only exported functions, they provide some generic
> + * infrastructure for managing object devices
> + */
> +
> +#define DEBUG_SUBSYSTEM S_CLASS
> +
> +#include <linux/module.h>
> +#include <linux/errno.h>
> +#include <linux/kernel.h>
> +#include <linux/sched.h>
> +#include <linux/lp.h>
> +#include <linux/slab.h>
> +#include <linux/ioport.h>
> +#include <linux/fcntl.h>
> +#include <linux/delay.h>
> +#include <linux/skbuff.h>
> +#include <linux/fs.h>
> +#include <linux/poll.h>
> +#include <linux/list.h>
> +#include <linux/highmem.h>
> +#include <linux/io.h>
> +#include <asm/ioctls.h>
> +#include <linux/uaccess.h>
> +#include <linux/miscdevice.h>
> +#include <linux/seq_file.h>
> +#include <linux/kobject.h>
> +
> +#include <uapi/linux/lnet/lnetctl.h>
> +#include <obd_support.h>
> +#include <obd_class.h>
> +#include <lprocfs_status.h>
> +#include <uapi/linux/lustre/lustre_ioctl.h>
> +#include <uapi/linux/lustre/lustre_ver.h>
> +
> +#define OBD_MAX_IOCTL_BUFFER 8192
> +
> +static int obd_ioctl_is_invalid(struct obd_ioctl_data *data)
> +{
> + if (data->ioc_len > BIT(30)) {
> + CERROR("OBD ioctl: ioc_len larger than 1<<30\n");
> + return 1;
> + }
> +
> + if (data->ioc_inllen1 > BIT(30)) {
> + CERROR("OBD ioctl: ioc_inllen1 larger than 1<<30\n");
> + return 1;
> + }
> +
> + if (data->ioc_inllen2 > BIT(30)) {
> + CERROR("OBD ioctl: ioc_inllen2 larger than 1<<30\n");
> + return 1;
> + }
> +
> + if (data->ioc_inllen3 > BIT(30)) {
> + CERROR("OBD ioctl: ioc_inllen3 larger than 1<<30\n");
> + return 1;
> + }
> +
> + if (data->ioc_inllen4 > BIT(30)) {
> + CERROR("OBD ioctl: ioc_inllen4 larger than 1<<30\n");
> + return 1;
> + }
> +
> + if (data->ioc_inlbuf1 && data->ioc_inllen1 == 0) {
> + CERROR("OBD ioctl: inlbuf1 pointer but 0 length\n");
> + return 1;
> + }
> +
> + if (data->ioc_inlbuf2 && data->ioc_inllen2 == 0) {
> + CERROR("OBD ioctl: inlbuf2 pointer but 0 length\n");
> + return 1;
> + }
> +
> + if (data->ioc_inlbuf3 && data->ioc_inllen3 == 0) {
> + CERROR("OBD ioctl: inlbuf3 pointer but 0 length\n");
> + return 1;
> + }
> +
> + if (data->ioc_inlbuf4 && data->ioc_inllen4 == 0) {
> + CERROR("OBD ioctl: inlbuf4 pointer but 0 length\n");
> + return 1;
> + }
> +
> + if (data->ioc_pbuf1 && data->ioc_plen1 == 0) {
> + CERROR("OBD ioctl: pbuf1 pointer but 0 length\n");
> + return 1;
> + }
> +
> + if (data->ioc_pbuf2 && data->ioc_plen2 == 0) {
> + CERROR("OBD ioctl: pbuf2 pointer but 0 length\n");
> + return 1;
> + }
> +
> + if (!data->ioc_pbuf1 && data->ioc_plen1 != 0) {
> + CERROR("OBD ioctl: plen1 set but NULL pointer\n");
> + return 1;
> + }
> +
> + if (!data->ioc_pbuf2 && data->ioc_plen2 != 0) {
> + CERROR("OBD ioctl: plen2 set but NULL pointer\n");
> + return 1;
> + }
> +
> + if (obd_ioctl_packlen(data) > data->ioc_len) {
> + CERROR("OBD ioctl: packlen exceeds ioc_len (%d > %d)\n",
> + obd_ioctl_packlen(data), data->ioc_len);
> + return 1;
> + }
> +
> + return 0;
> +}
> +
> +/* buffer MUST be at least the size of obd_ioctl_hdr */
> +int obd_ioctl_getdata(char **buf, int *len, void __user *arg)
> +{
> + struct obd_ioctl_hdr hdr;
> + struct obd_ioctl_data *data;
> + int err;
> + int offset = 0;
> +
> + if (copy_from_user(&hdr, arg, sizeof(hdr)))
> + return -EFAULT;
> +
> + if (hdr.ioc_version != OBD_IOCTL_VERSION) {
> + CERROR("Version mismatch kernel (%x) vs application (%x)\n",
> + OBD_IOCTL_VERSION, hdr.ioc_version);
> + return -EINVAL;
> + }
> +
> + if (hdr.ioc_len > OBD_MAX_IOCTL_BUFFER) {
> + CERROR("User buffer len %d exceeds %d max buffer\n",
> + hdr.ioc_len, OBD_MAX_IOCTL_BUFFER);
> + return -EINVAL;
> + }
> +
> + if (hdr.ioc_len < sizeof(struct obd_ioctl_data)) {
> + CERROR("User buffer too small for ioctl (%d)\n", hdr.ioc_len);
> + return -EINVAL;
> + }
> +
> + /* When there are lots of processes calling vmalloc on multi-core
> + * system, the high lock contention will hurt performance badly,
> + * obdfilter-survey is an example, which relies on ioctl. So we'd
> + * better avoid vmalloc on ioctl path. LU-66
> + */
> + *buf = kvzalloc(hdr.ioc_len, GFP_KERNEL);
> + if (!*buf) {
> + CERROR("Cannot allocate control buffer of len %d\n",
> + hdr.ioc_len);
> + return -EINVAL;
> + }
> + *len = hdr.ioc_len;
> + data = (struct obd_ioctl_data *)*buf;
> +
> + if (copy_from_user(*buf, arg, hdr.ioc_len)) {
> + err = -EFAULT;
> + goto free_buf;
> + }
> + if (hdr.ioc_len != data->ioc_len) {
> + err = -EINVAL;
> + goto free_buf;
> + }
> +
> + if (obd_ioctl_is_invalid(data)) {
> + CERROR("ioctl not correctly formatted\n");
> + err = -EINVAL;
> + goto free_buf;
> + }
> +
> + if (data->ioc_inllen1) {
> + data->ioc_inlbuf1 = &data->ioc_bulk[0];
> + offset += cfs_size_round(data->ioc_inllen1);
> + }
> +
> + if (data->ioc_inllen2) {
> + data->ioc_inlbuf2 = &data->ioc_bulk[0] + offset;
> + offset += cfs_size_round(data->ioc_inllen2);
> + }
> +
> + if (data->ioc_inllen3) {
> + data->ioc_inlbuf3 = &data->ioc_bulk[0] + offset;
> + offset += cfs_size_round(data->ioc_inllen3);
> + }
> +
> + if (data->ioc_inllen4)
> + data->ioc_inlbuf4 = &data->ioc_bulk[0] + offset;
> +
> + return 0;
> +
> +free_buf:
> + kvfree(*buf);
> + return err;
> +}
> +EXPORT_SYMBOL(obd_ioctl_getdata);
> +
> +/* opening /dev/obd */
> +static int obd_class_open(struct inode *inode, struct file *file)
> +{
> + try_module_get(THIS_MODULE);
> + return 0;
> +}
> +
> +/* closing /dev/obd */
> +static int obd_class_release(struct inode *inode, struct file *file)
> +{
> + module_put(THIS_MODULE);
> + return 0;
> +}
> +
> +/* to control /dev/obd */
> +static long obd_class_ioctl(struct file *filp, unsigned int cmd,
> + unsigned long arg)
> +{
> + int err = 0;
> +
> + /* Allow non-root access for OBD_IOC_PING_TARGET - used by lfs check */
> + if (!capable(CAP_SYS_ADMIN) && (cmd != OBD_IOC_PING_TARGET))
> + return err = -EACCES;
> + if ((cmd & 0xffffff00) == ((int)'T') << 8) /* ignore all tty ioctls */
> + return err = -ENOTTY;
> +
> + err = class_handle_ioctl(cmd, (unsigned long)arg);
> +
> + return err;
> +}
> +
> +/* declare character device */
> +static const struct file_operations obd_psdev_fops = {
> + .owner = THIS_MODULE,
> + .unlocked_ioctl = obd_class_ioctl, /* unlocked_ioctl */
> + .open = obd_class_open, /* open */
> + .release = obd_class_release, /* release */
> +};
> +
> +/* modules setup */
> +struct miscdevice obd_psdev = {
> + .minor = MISC_DYNAMIC_MINOR,
> + .name = OBD_DEV_NAME,
> + .fops = &obd_psdev_fops,
> +};
> +
> +static ssize_t version_show(struct kobject *kobj, struct attribute *attr,
> + char *buf)
> +{
> + return sprintf(buf, "%s\n", LUSTRE_VERSION_STRING);
> +}
> +
> +static ssize_t pinger_show(struct kobject *kobj, struct attribute *attr,
> + char *buf)
> +{
> + return sprintf(buf, "%s\n", "on");
> +}
> +
> +static ssize_t
> +health_check_show(struct kobject *kobj, struct attribute *attr, char *buf)
> +{
> + bool healthy = true;
> + int i;
> + size_t len = 0;
> +
> + if (libcfs_catastrophe)
> + return sprintf(buf, "LBUG\n");
> +
> + read_lock(&obd_dev_lock);
> + for (i = 0; i < class_devno_max(); i++) {
> + struct obd_device *obd;
> +
> + obd = class_num2obd(i);
> + if (!obd || !obd->obd_attached || !obd->obd_set_up)
> + continue;
> +
> + LASSERT(obd->obd_magic == OBD_DEVICE_MAGIC);
> + if (obd->obd_stopping)
> + continue;
> +
> + class_incref(obd, __func__, current);
> + read_unlock(&obd_dev_lock);
> +
> + if (obd_health_check(NULL, obd))
> + healthy = false;
> + class_decref(obd, __func__, current);
> + read_lock(&obd_dev_lock);
> + }
> + read_unlock(&obd_dev_lock);
> +
> + if (healthy)
> + len = sprintf(buf, "healthy\n");
> + else
> + len = sprintf(buf, "NOT HEALTHY\n");
> +
> + return len;
> +}
> +
> +static ssize_t jobid_var_show(struct kobject *kobj, struct attribute *attr,
> + char *buf)
> +{
> + return snprintf(buf, PAGE_SIZE, "%s\n", obd_jobid_var);
> +}
> +
> +static ssize_t jobid_var_store(struct kobject *kobj, struct attribute *attr,
> + const char *buffer,
> + size_t count)
> +{
> + if (!count || count > JOBSTATS_JOBID_VAR_MAX_LEN)
> + return -EINVAL;
> +
> + memset(obd_jobid_var, 0, JOBSTATS_JOBID_VAR_MAX_LEN + 1);
> +
> + memcpy(obd_jobid_var, buffer, count);
> +
> + /* Trim the trailing '\n' if any */
> + if (obd_jobid_var[count - 1] == '\n')
> + obd_jobid_var[count - 1] = 0;
> +
> + return count;
> +}
> +
> +static ssize_t jobid_name_show(struct kobject *kobj, struct attribute *attr,
> + char *buf)
> +{
> + return snprintf(buf, PAGE_SIZE, "%s\n", obd_jobid_node);
> +}
> +
> +static ssize_t jobid_name_store(struct kobject *kobj, struct attribute *attr,
> + const char *buffer,
> + size_t count)
> +{
> + if (!count || count > LUSTRE_JOBID_SIZE)
> + return -EINVAL;
> +
> + memcpy(obd_jobid_node, buffer, count);
> +
> + obd_jobid_node[count] = 0;
> +
> + /* Trim the trailing '\n' if any */
> + if (obd_jobid_node[count - 1] == '\n')
> + obd_jobid_node[count - 1] = 0;
> +
> + return count;
> +}
> +
> +/* Root for /sys/kernel/debug/lustre */
> +struct dentry *debugfs_lustre_root;
> +EXPORT_SYMBOL_GPL(debugfs_lustre_root);
> +
> +LUSTRE_RO_ATTR(version);
> +LUSTRE_RO_ATTR(pinger);
> +LUSTRE_RO_ATTR(health_check);
> +LUSTRE_RW_ATTR(jobid_var);
> +LUSTRE_RW_ATTR(jobid_name);
> +
> +static struct attribute *lustre_attrs[] = {
> + &lustre_attr_version.attr,
> + &lustre_attr_pinger.attr,
> + &lustre_attr_health_check.attr,
> + &lustre_attr_jobid_name.attr,
> + &lustre_attr_jobid_var.attr,
> + NULL,
> +};
> +
> +static void *obd_device_list_seq_start(struct seq_file *p, loff_t *pos)
> +{
> + if (*pos >= class_devno_max())
> + return NULL;
> +
> + return pos;
> +}
> +
> +static void obd_device_list_seq_stop(struct seq_file *p, void *v)
> +{
> +}
> +
> +static void *obd_device_list_seq_next(struct seq_file *p, void *v, loff_t *pos)
> +{
> + ++*pos;
> + if (*pos >= class_devno_max())
> + return NULL;
> +
> + return pos;
> +}
> +
> +static int obd_device_list_seq_show(struct seq_file *p, void *v)
> +{
> + loff_t index = *(loff_t *)v;
> + struct obd_device *obd = class_num2obd((int)index);
> + char *status;
> +
> + if (!obd)
> + return 0;
> +
> + LASSERT(obd->obd_magic == OBD_DEVICE_MAGIC);
> + if (obd->obd_stopping)
> + status = "ST";
> + else if (obd->obd_inactive)
> + status = "IN";
> + else if (obd->obd_set_up)
> + status = "UP";
> + else if (obd->obd_attached)
> + status = "AT";
> + else
> + status = "--";
> +
> + seq_printf(p, "%3d %s %s %s %s %d\n",
> + (int)index, status, obd->obd_type->typ_name,
> + obd->obd_name, obd->obd_uuid.uuid,
> + atomic_read(&obd->obd_refcount));
> + return 0;
> +}
> +
> +static const struct seq_operations obd_device_list_sops = {
> + .start = obd_device_list_seq_start,
> + .stop = obd_device_list_seq_stop,
> + .next = obd_device_list_seq_next,
> + .show = obd_device_list_seq_show,
> +};
> +
> +static int obd_device_list_open(struct inode *inode, struct file *file)
> +{
> + struct seq_file *seq;
> + int rc = seq_open(file, &obd_device_list_sops);
> +
> + if (rc)
> + return rc;
> +
> + seq = file->private_data;
> + seq->private = inode->i_private;
> +
> + return 0;
> +}
> +
> +static const struct file_operations obd_device_list_fops = {
> + .owner = THIS_MODULE,
> + .open = obd_device_list_open,
> + .read = seq_read,
> + .llseek = seq_lseek,
> + .release = seq_release,
> +};
> +
> +struct kobject *lustre_kobj;
> +EXPORT_SYMBOL_GPL(lustre_kobj);
> +
> +static const struct attribute_group lustre_attr_group = {
> + .attrs = lustre_attrs,
> +};
> +
> +int class_procfs_init(void)
> +{
> + int rc = -ENOMEM;
> +
> + lustre_kobj = kobject_create_and_add("lustre", fs_kobj);
> + if (!lustre_kobj)
> + goto out;
> +
> + /* Create the files associated with this kobject */
> + rc = sysfs_create_group(lustre_kobj, &lustre_attr_group);
> + if (rc) {
> + kobject_put(lustre_kobj);
> + goto out;
> + }
> +
> + debugfs_lustre_root = debugfs_create_dir("lustre", NULL);
> +
> + debugfs_create_file("devices", 0444, debugfs_lustre_root, NULL,
> + &obd_device_list_fops);
> +out:
> + return rc;
> +}
> +
> +int class_procfs_clean(void)
> +{
> + debugfs_remove_recursive(debugfs_lustre_root);
> +
> + debugfs_lustre_root = NULL;
> +
> + sysfs_remove_group(lustre_kobj, &lustre_attr_group);
> + kobject_put(lustre_kobj);
> +
> + return 0;
> +}
> diff --git a/drivers/staging/lustre/lustre/obdclass/sysctl.c b/drivers/staging/lustre/lustre/obdclass/sysctl.c
> new file mode 100644
> index 000000000000..e5e8687784ee
> --- /dev/null
> +++ b/drivers/staging/lustre/lustre/obdclass/sysctl.c
> @@ -0,0 +1,162 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * GPL HEADER START
> + *
> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 only,
> + * as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * General Public License version 2 for more details (a copy is included
> + * in the LICENSE file that accompanied this code).
> + *
> + * You should have received a copy of the GNU General Public License
> + * version 2 along with this program; If not, see
> + * http://www.gnu.org/licenses/gpl-2.0.html
> + *
> + * GPL HEADER END
> + */
> +/*
> + * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
> + * Use is subject to license terms.
> + *
> + * Copyright (c) 2011, 2015, Intel Corporation.
> + */
> +/*
> + * This file is part of Lustre, http://www.lustre.org/
> + * Lustre is a trademark of Sun Microsystems, Inc.
> + */
> +
> +#include <linux/module.h>
> +#include <linux/sysctl.h>
> +#include <linux/sched.h>
> +#include <linux/mm.h>
> +#include <linux/slab.h>
> +#include <linux/stat.h>
> +#include <linux/ctype.h>
> +#include <linux/bitops.h>
> +#include <linux/uaccess.h>
> +#include <linux/utsname.h>
> +
> +#define DEBUG_SUBSYSTEM S_CLASS
> +
> +#include <obd_support.h>
> +#include <lprocfs_status.h>
> +#include <obd_class.h>
> +
> +struct static_lustre_uintvalue_attr {
> + struct {
> + struct attribute attr;
> + ssize_t (*show)(struct kobject *kobj, struct attribute *attr,
> + char *buf);
> + ssize_t (*store)(struct kobject *kobj, struct attribute *attr,
> + const char *buf, size_t len);
> + } u;
> + int *value;
> +};
> +
> +static ssize_t static_uintvalue_show(struct kobject *kobj,
> + struct attribute *attr,
> + char *buf)
> +{
> + struct static_lustre_uintvalue_attr *lattr = (void *)attr;
> +
> + return sprintf(buf, "%d\n", *lattr->value);
> +}
> +
> +static ssize_t static_uintvalue_store(struct kobject *kobj,
> + struct attribute *attr,
> + const char *buffer, size_t count)
> +{
> + struct static_lustre_uintvalue_attr *lattr = (void *)attr;
> + int rc;
> + unsigned int val;
> +
> + rc = kstrtouint(buffer, 10, &val);
> + if (rc)
> + return rc;
> +
> + *lattr->value = val;
> +
> + return count;
> +}
> +
> +#define LUSTRE_STATIC_UINT_ATTR(name, value) \
> +static struct static_lustre_uintvalue_attr lustre_sattr_##name = \
> + {__ATTR(name, 0644, \
> + static_uintvalue_show, \
> + static_uintvalue_store),\
> + value }
> +
> +LUSTRE_STATIC_UINT_ATTR(timeout, &obd_timeout);
> +
> +static ssize_t max_dirty_mb_show(struct kobject *kobj, struct attribute *attr,
> + char *buf)
> +{
> + return sprintf(buf, "%lu\n",
> + obd_max_dirty_pages / (1 << (20 - PAGE_SHIFT)));
> +}
> +
> +static ssize_t max_dirty_mb_store(struct kobject *kobj, struct attribute *attr,
> + const char *buffer, size_t count)
> +{
> + int rc;
> + unsigned long val;
> +
> + rc = kstrtoul(buffer, 10, &val);
> + if (rc)
> + return rc;
> +
> + val *= 1 << (20 - PAGE_SHIFT); /* convert to pages */
> +
> + if (val > ((totalram_pages / 10) * 9)) {
> + /* Somebody wants to assign too much memory to dirty pages */
> + return -EINVAL;
> + }
> +
> + if (val < 4 << (20 - PAGE_SHIFT)) {
> + /* Less than 4 Mb for dirty cache is also bad */
> + return -EINVAL;
> + }
> +
> + obd_max_dirty_pages = val;
> +
> + return count;
> +}
> +LUSTRE_RW_ATTR(max_dirty_mb);
> +
> +LUSTRE_STATIC_UINT_ATTR(debug_peer_on_timeout, &obd_debug_peer_on_timeout);
> +LUSTRE_STATIC_UINT_ATTR(dump_on_timeout, &obd_dump_on_timeout);
> +LUSTRE_STATIC_UINT_ATTR(dump_on_eviction, &obd_dump_on_eviction);
> +LUSTRE_STATIC_UINT_ATTR(at_min, &at_min);
> +LUSTRE_STATIC_UINT_ATTR(at_max, &at_max);
> +LUSTRE_STATIC_UINT_ATTR(at_extra, &at_extra);
> +LUSTRE_STATIC_UINT_ATTR(at_early_margin, &at_early_margin);
> +LUSTRE_STATIC_UINT_ATTR(at_history, &at_history);
> +
> +static struct attribute *lustre_attrs[] = {
> + &lustre_sattr_timeout.u.attr,
> + &lustre_attr_max_dirty_mb.attr,
> + &lustre_sattr_debug_peer_on_timeout.u.attr,
> + &lustre_sattr_dump_on_timeout.u.attr,
> + &lustre_sattr_dump_on_eviction.u.attr,
> + &lustre_sattr_at_min.u.attr,
> + &lustre_sattr_at_max.u.attr,
> + &lustre_sattr_at_extra.u.attr,
> + &lustre_sattr_at_early_margin.u.attr,
> + &lustre_sattr_at_history.u.attr,
> + NULL,
> +};
> +
> +static const struct attribute_group lustre_attr_group = {
> + .attrs = lustre_attrs,
> +};
> +
> +int obd_sysctl_init(void)
> +{
> + return sysfs_create_group(lustre_kobj, &lustre_attr_group);
> +}
>
>
>