X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fobdclass%2Flinux%2Flinux-module.c;h=3480e205d77b6c253e60423b415feb811e2341a4;hb=6e3ec5812ebd1b5ecf7cae584f429b013ffe7431;hp=57da96649d84e707c08c7bfa47853203649a2ae4;hpb=d2d56f38da01001c92a09afc6b52b5acbd9bc13c;p=fs%2Flustre-release.git diff --git a/lustre/obdclass/linux/linux-module.c b/lustre/obdclass/linux/linux-module.c index 57da966..3480e20 100644 --- a/lustre/obdclass/linux/linux-module.c +++ b/lustre/obdclass/linux/linux-module.c @@ -1,35 +1,52 @@ /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * - * Object Devices Class Driver + * GPL HEADER START + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * - * Copyright (C) 2001-2003 Cluster File Systems, Inc. + * 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 file is part of Lustre, http://www.lustre.org. + * 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). * - * Lustre is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf * - * Lustre 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 for more details. + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + * GPL HEADER END + */ +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Use is subject to license terms. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. * - * You should have received a copy of the GNU General Public License - * along with Lustre; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * 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 #ifndef EXPORT_SYMTAB # define EXPORT_SYMTAB #endif #ifdef __KERNEL__ -#ifdef HAVE_KERNEL_CONFIG_H +#ifndef AUTOCONF_INCLUDED #include /* for CONFIG_PROC_FS */ #endif #include @@ -81,8 +98,8 @@ int obd_ioctl_getdata(char **buf, int *len, void *arg) int offset = 0; ENTRY; - err = copy_from_user(&hdr, (void *)arg, sizeof(hdr)); - if ( err ) + err = cfs_copy_from_user(&hdr, (void *)arg, sizeof(hdr)); + if ( err ) RETURN(err); if (hdr.ioc_version != OBD_IOCTL_VERSION) { @@ -113,7 +130,7 @@ int obd_ioctl_getdata(char **buf, int *len, void *arg) *len = hdr.ioc_len; data = (struct obd_ioctl_data *)*buf; - err = copy_from_user(*buf, (void *)arg, hdr.ioc_len); + err = cfs_copy_from_user(*buf, (void *)arg, hdr.ioc_len); if ( err ) { OBD_VFREE(*buf, hdr.ioc_len); RETURN(err); @@ -127,17 +144,17 @@ int obd_ioctl_getdata(char **buf, int *len, void *arg) if (data->ioc_inllen1) { data->ioc_inlbuf1 = &data->ioc_bulk[0]; - offset += size_round(data->ioc_inllen1); + offset += cfs_size_round(data->ioc_inllen1); } if (data->ioc_inllen2) { data->ioc_inlbuf2 = &data->ioc_bulk[0] + offset; - offset += size_round(data->ioc_inllen2); + offset += cfs_size_round(data->ioc_inllen2); } if (data->ioc_inllen3) { data->ioc_inlbuf3 = &data->ioc_bulk[0] + offset; - offset += size_round(data->ioc_inllen3); + offset += cfs_size_round(data->ioc_inllen3); } if (data->ioc_inllen4) { @@ -150,9 +167,9 @@ int obd_ioctl_getdata(char **buf, int *len, void *arg) int obd_ioctl_popdata(void *arg, void *data, int len) { - int err; - - err = copy_to_user(arg, data, len); + int err; + + err = cfs_copy_to_user(arg, data, len); if (err) err = -EFAULT; return err; @@ -187,7 +204,8 @@ static int obd_class_ioctl(struct inode *inode, struct file *filp, int err = 0; ENTRY; - if (current->fsuid != 0) + /* Allow non-root access for OBD_IOC_PING_TARGET - used by lfs check */ + if (!cfs_capable(CFS_CAP_SYS_ADMIN) && (cmd != OBD_IOC_PING_TARGET)) RETURN(err = -EACCES); if ((cmd & 0xffffff00) == ((int)'T') << 8) /* ignore all tty ioctls */ RETURN(err = -ENOTTY); @@ -222,13 +240,14 @@ int obd_proc_read_version(char *page, char **start, off_t off, int count, int *eof, void *data) { *eof = 1; -#ifdef LUSTRE_KERNEL_VERSION +#ifdef HAVE_VFS_INTENT_PATCHES return snprintf(page, count, "lustre: %s\nkernel: %u\nbuild: %s\n", LUSTRE_VERSION_STRING, LUSTRE_KERNEL_VERSION, BUILD_VERSION); #else return snprintf(page, count, "lustre: %s\nkernel: %s\nbuild: %s\n", - LUSTRE_VERSION_STRING, "patchless", BUILD_VERSION); + LUSTRE_VERSION_STRING, "patchless_client", + BUILD_VERSION); #endif } @@ -245,6 +264,21 @@ int obd_proc_read_pinger(char *page, char **start, off_t off, int count, ); } +/** + * Check all obd devices health + * + * \param page + * \param start + * \param off + * \param count + * \param eof + * \param data + * proc read function parameters, please refer to kernel + * code fs/proc/generic.c proc_file_read() + * \param data [in] unused + * + * \retval number of characters printed + */ static int obd_proc_read_health(char *page, char **start, off_t off, int count, int *eof, void *data) { @@ -254,30 +288,30 @@ static int obd_proc_read_health(char *page, char **start, off_t off, if (libcfs_catastrophe) rc += snprintf(page + rc, count - rc, "LBUG\n"); - spin_lock(&obd_dev_lock); + cfs_spin_lock(&obd_dev_lock); for (i = 0; i < class_devno_max(); i++) { struct obd_device *obd; obd = class_num2obd(i); - if (obd == NULL) + if (obd == NULL || !obd->obd_attached || !obd->obd_set_up) continue; LASSERT(obd->obd_magic == OBD_DEVICE_MAGIC); if (obd->obd_stopping) continue; - class_incref(obd); - spin_unlock(&obd_dev_lock); + class_incref(obd, __FUNCTION__, cfs_current()); + cfs_spin_unlock(&obd_dev_lock); if (obd_health_check(obd)) { rc += snprintf(page + rc, count - rc, "device %s reported unhealthy\n", obd->obd_name); } - class_decref(obd); - spin_lock(&obd_dev_lock); + class_decref(obd, __FUNCTION__, cfs_current()); + cfs_spin_lock(&obd_dev_lock); } - spin_unlock(&obd_dev_lock); + cfs_spin_unlock(&obd_dev_lock); if (rc == 0) return snprintf(page, count, "healthy\n"); @@ -286,27 +320,6 @@ static int obd_proc_read_health(char *page, char **start, off_t off, return rc; } -static int obd_proc_rd_health_timeout(char *page, char **start, off_t off, - int count, int *eof, void *data) -{ - *eof = 1; - return snprintf(page, count, "%d\n", obd_health_check_timeout); -} - -static int obd_proc_wr_health_timeout(struct file *file, const char *buffer, - unsigned long count, void *data) -{ - int val, rc; - - rc = lprocfs_write_helper(buffer, count, &val); - if (rc) - return rc; - - obd_health_check_timeout = val; - - return count; -} - /* Root for /proc/fs/lustre */ struct proc_dir_entry *proc_lustre_root = NULL; @@ -314,8 +327,6 @@ struct lprocfs_vars lprocfs_base[] = { { "version", obd_proc_read_version, NULL, NULL }, { "pinger", obd_proc_read_pinger, NULL, NULL }, { "health_check", obd_proc_read_health, NULL, NULL }, - { "health_check_timeout", obd_proc_rd_health_timeout, - obd_proc_wr_health_timeout, NULL }, { 0 } }; #else @@ -336,7 +347,7 @@ 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; @@ -346,8 +357,8 @@ static void *obd_device_list_seq_next(struct seq_file *p, void *v, loff_t *pos) static int obd_device_list_seq_show(struct seq_file *p, void *v) { - int index = *(loff_t *)v; - struct obd_device *obd = class_num2obd(index); + loff_t index = *(loff_t *)v; + struct obd_device *obd = class_num2obd((int)index); char *status; if (obd == NULL) @@ -356,6 +367,8 @@ static int obd_device_list_seq_show(struct seq_file *p, void *v) 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) @@ -366,7 +379,7 @@ static int obd_device_list_seq_show(struct seq_file *p, void *v) return 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)); + cfs_atomic_read(&obd->obd_refcount)); } struct seq_operations obd_device_list_sops = { @@ -403,24 +416,16 @@ struct file_operations obd_device_list_fops = { int class_procfs_init(void) { #ifdef __KERNEL__ - struct proc_dir_entry *entry; + int rc; ENTRY; obd_sysctl_init(); - proc_lustre_root = proc_mkdir("lustre", proc_root_fs); - if (!proc_lustre_root) { - printk(KERN_ERR - "LustreError: error registering /proc/fs/lustre\n"); - RETURN(-ENOMEM); - } - proc_version = lprocfs_add_vars(proc_lustre_root, lprocfs_base, NULL); - entry = create_proc_entry("devices", 0444, proc_lustre_root); - if (entry == NULL) { - CERROR("error registering /proc/fs/lustre/devices\n"); - lprocfs_remove(&proc_lustre_root); - RETURN(-ENOMEM); - } - entry->proc_fops = &obd_device_list_fops; + proc_lustre_root = lprocfs_register("fs/lustre", NULL, + lprocfs_base, NULL); + rc = lprocfs_seq_create(proc_lustre_root, "devices", 0444, + &obd_device_list_fops, NULL); + if (rc) + CERROR("error adding /proc/fs/lustre/devices file\n"); #else ENTRY; #endif