Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp1395422imm; Wed, 13 Jun 2018 19:41:15 -0700 (PDT) X-Google-Smtp-Source: ADUXVKImlVp8UAIkOKJjz5Axo3ZTHkd75VYLBWbQE+uIZF0C/6kIOuWiQzrCU5R/TboN7++UVL+W X-Received: by 2002:a62:4785:: with SMTP id p5-v6mr7451823pfi.164.1528944075818; Wed, 13 Jun 2018 19:41:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528944075; cv=none; d=google.com; s=arc-20160816; b=wEXzOoYDE3a72o6/LUvYtwL+3v4XfNGu/Yjw3451FwEWiIY+/0idRK+63GBjv5ECra gy1Id+znCT4jf8TwPvPLSqFHobr9zyQqXFLiV/cHfGdLLXOf1WL3ex4+hkoXAHIdJweD XIpYz3xlUS2IytA5yMNq4nEnQ1OKR+ZUG0G+VyHdPhf2oT3HQt3wZ01PV+bF5SAAdafz 778c99XGHTkM6zZ4/P5Uba6uFq7lMgVIKrwtPsE88jz4ULxw70CSGV9ft8vT7zpzLRgz cYx2sm4UL6ZsCtJTNd24X65/H4ygCfXnGNdKZ1w5GaSLc98BBXHrvyKnSq3OF9za2mK0 8yNA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :message-id:in-reply-to:subject:cc:to:from:date:dkim-signature :arc-authentication-results; bh=VIF+Ike//kiyGKU9dPXub6uFPnyS2hoGrEa4zOJkqKA=; b=Zrq8ahZXm7KflFdVkml8pX7/vCDwO2HqDFxyTRml5MsBQlcPgZSGZy09qfE9BAZHyp /qbqNtuhUZuP9I0pHJRka7xIlcaZA3yKiKnB7lLlYhw/HaKVTWygxf+gbJ+0dGheIeQH Hmfn9YqSOB2YgoXqb19i9Z70021Xs7tAgApGiwG/s3Tg7Ijzzt1NehDuOe6tRB5PNFF0 euvOudibUsQcITBTAXEpW7enlalsRKUbVSmkNpQ+R5pqQYZHMocUXmRFj0vcBA171mUa tISEh66L/e38mg7VudApLhik5TOXLFB8CqFuZz5HOE0W5ukCl6Y5QZcSgmrLQP7xypMF 1stQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@infradead.org header.s=casper.20170209 header.b=PTTdGZ5m; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c11-v6si3556941pgt.686.2018.06.13.19.41.01; Wed, 13 Jun 2018 19:41:15 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@infradead.org header.s=casper.20170209 header.b=PTTdGZ5m; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935897AbeFNCkR (ORCPT + 99 others); Wed, 13 Jun 2018 22:40:17 -0400 Received: from casper.infradead.org ([85.118.1.10]:35916 "EHLO casper.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S935736AbeFNCkQ (ORCPT ); Wed, 13 Jun 2018 22:40:16 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Type:MIME-Version:References: Message-ID:In-Reply-To:Subject:cc:To:From:Date:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=VIF+Ike//kiyGKU9dPXub6uFPnyS2hoGrEa4zOJkqKA=; b=PTTdGZ5m/v81nbZWMJ+i3KNRO 3g14ZUypLwhzXlbUi+t7zm5krciOQIZW1e6cRwve80/XnqoMWdi6kHDMGsGdIypPwsZSzH4pXC75v hf/juIHtzDs608qxQAu/O73xUEl/+SVKH+5qNCpRVS38MaOhIZN6xtb/zv4uLsvRqgP2g0VPqnFj+ F64eDzVy/g5eSeVakdZ03n1hbCr1APWtLMelj7Iq0hni65QXA9l2dvJruZdjXFYkyTwQAIadkNmey Z2ThG67cPyWWCR8jEwDQ9GAitkBCn1+3PeeYCU9VthVfmHX7NYcX5LefFptiPDOLl0ctvd6Y3rPSV lm7Uih++w==; Received: from jsimmons (helo=localhost) by casper.infradead.org with local-esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fTIBE-0002H3-Lb; Thu, 14 Jun 2018 02:40:12 +0000 Date: Thu, 14 Jun 2018 03:40:08 +0100 (BST) From: James Simmons To: NeilBrown cc: Oleg Drokin , Greg Kroah-Hartman , Andreas Dilger , Linux Kernel Mailing List , Lustre Development List Subject: Re: [PATCH 08/11] staging: lustre: obdclass: move linux/linux-foo.c to foo.c In-Reply-To: <152826511916.16761.16388038372000609798.stgit@noble> Message-ID: References: <152826510267.16761.14361003167157833896.stgit@noble> <152826511916.16761.16388038372000609798.stgit@noble> User-Agent: Alpine 2.21 (LFD 202 2017-01-01) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180614_034008_828517_B005AF54 X-CRM114-Status: GOOD ( 34.60 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.1 on casper.infradead.org summary: Content analysis details: (-0.0 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 NO_RELAYS Informational: message was not relayed via SMTP Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org > 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 > Signed-off-by: NeilBrown > --- > 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 > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > - > -#include > -#include > -#include > -#include > -#include > -#include > - > -#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 > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > - > -#define DEBUG_SUBSYSTEM S_CLASS > - > -#include > -#include > -#include > - > -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 > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > +#include > +#include > +#include > +#include > + > +#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 > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#define DEBUG_SUBSYSTEM S_CLASS > + > +#include > +#include > +#include > + > +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); > +} > > >