[lustre-devel] [PATCH 08/11] staging: lustre: obdclass: move linux/linux-foo.c to foo.c

James Simmons jsimmons at infradead.org
Wed Jun 13 19:40:08 PDT 2018


> 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 at infradead.org>
 
> Signed-off-by: NeilBrown <neilb at suse.com>
> ---
>  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);
> +}
> 
> 
> 


More information about the lustre-devel mailing list