-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
* GPL HEADER START
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* GPL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2011, Whamcloud, Inc.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
*/
#define DEBUG_SUBSYSTEM S_CLASS
-#ifndef EXPORT_SYMTAB
-# define EXPORT_SYMTAB
-#endif
#ifdef __KERNEL__
-#ifndef AUTOCONF_INCLUDED
-#include <linux/config.h> /* for CONFIG_PROC_FS */
-#endif
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <asm/poll.h>
#include <asm/uaccess.h>
#include <linux/miscdevice.h>
-#include <linux/smp_lock.h>
#include <linux/seq_file.h>
#else
# include <liblustre.h>
#include <libcfs/libcfs.h>
#include <obd_support.h>
#include <obd_class.h>
+#include <lnet/lnetctl.h>
#include <lprocfs_status.h>
#include <lustre_ver.h>
#include <lustre/lustre_build_version.h>
#ifdef __KERNEL__
-#include <linux/lustre_version.h>
int proc_version;
RETURN(-EINVAL);
}
- /* XXX allocate this more intelligently, using kmalloc when
- * appropriate */
- OBD_VMALLOC(*buf, hdr.ioc_len);
+ /* 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 */
+ OBD_ALLOC_LARGE(*buf, hdr.ioc_len);
if (*buf == NULL) {
CERROR("Cannot allocate control buffer of len %d\n",
hdr.ioc_len);
err = cfs_copy_from_user(*buf, (void *)arg, hdr.ioc_len);
if ( err ) {
- OBD_VFREE(*buf, hdr.ioc_len);
+ OBD_FREE_LARGE(*buf, hdr.ioc_len);
RETURN(err);
}
if (obd_ioctl_is_invalid(data)) {
CERROR("ioctl not correctly formatted\n");
- OBD_VFREE(*buf, hdr.ioc_len);
+ OBD_FREE_LARGE(*buf, hdr.ioc_len);
RETURN(-EINVAL);
}
EXPORT_SYMBOL(obd_ioctl_getdata);
EXPORT_SYMBOL(obd_ioctl_popdata);
-#define OBD_MINOR 241
-extern struct cfs_psdev_ops obd_psdev_ops;
-
/* opening /dev/obd */
static int obd_class_open(struct inode * inode, struct file * file)
{
- if (obd_psdev_ops.p_open != NULL)
- return obd_psdev_ops.p_open(0, NULL);
- return -EPERM;
+ ENTRY;
+
+ PORTAL_MODULE_USE;
+ RETURN(0);
}
/* closing /dev/obd */
static int obd_class_release(struct inode * inode, struct file * file)
{
- if (obd_psdev_ops.p_close != NULL)
- return obd_psdev_ops.p_close(0, NULL);
- return -EPERM;
+ ENTRY;
+
+ PORTAL_MODULE_UNUSE;
+ RETURN(0);
}
/* to control /dev/obd */
-static int obd_class_ioctl(struct inode *inode, struct file *filp,
- unsigned int cmd, unsigned long arg)
+static long obd_class_ioctl(struct file *filp, unsigned int cmd,
+ unsigned long arg)
{
int err = 0;
ENTRY;
if ((cmd & 0xffffff00) == ((int)'T') << 8) /* ignore all tty ioctls */
RETURN(err = -ENOTTY);
- if (obd_psdev_ops.p_ioctl != NULL)
- err = obd_psdev_ops.p_ioctl(NULL, cmd, (void *)arg);
- else
- err = -EPERM;
+ err = class_handle_ioctl(cmd, (unsigned long)arg);
RETURN(err);
}
/* declare character device */
static struct file_operations obd_psdev_fops = {
- .owner = THIS_MODULE,
- .ioctl = obd_class_ioctl, /* ioctl */
- .open = obd_class_open, /* open */
- .release = obd_class_release, /* release */
+ .owner = THIS_MODULE,
+ .unlocked_ioctl = obd_class_ioctl, /* unlocked_ioctl */
+ .open = obd_class_open, /* open */
+ .release = obd_class_release, /* release */
};
/* modules setup */
cfs_psdev_t obd_psdev = {
- .minor = OBD_MINOR,
- .name = "obd_psdev",
+ .minor = OBD_DEV_MINOR,
+ .name = OBD_DEV_NAME,
.fops = &obd_psdev_fops,
};
int *eof, void *data)
{
*eof = 1;
-#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_client",
BUILD_VERSION);
-#endif
}
int obd_proc_read_pinger(char *page, char **start, off_t off, int count,
if (libcfs_catastrophe)
rc += snprintf(page + rc, count - rc, "LBUG\n");
- cfs_spin_lock(&obd_dev_lock);
+ cfs_read_lock(&obd_dev_lock);
for (i = 0; i < class_devno_max(); i++) {
struct obd_device *obd;
continue;
class_incref(obd, __FUNCTION__, cfs_current());
- cfs_spin_unlock(&obd_dev_lock);
+ cfs_read_unlock(&obd_dev_lock);
- if (obd_health_check(obd)) {
+ if (obd_health_check(NULL, obd)) {
rc += snprintf(page + rc, count - rc,
"device %s reported unhealthy\n",
obd->obd_name);
}
class_decref(obd, __FUNCTION__, cfs_current());
- cfs_spin_lock(&obd_dev_lock);
+ cfs_read_lock(&obd_dev_lock);
}
- cfs_spin_unlock(&obd_dev_lock);
+ cfs_read_unlock(&obd_dev_lock);
if (rc == 0)
return snprintf(page, count, "healthy\n");
return rc;
}
+static int obd_proc_rd_jobid_var(char *page, char **start, off_t off,
+ int count, int *eof, void *data)
+{
+ return snprintf(page, count, "%s\n", obd_jobid_var);
+}
+
+static int obd_proc_wr_jobid_var(struct file *file, const char *buffer,
+ unsigned long count, void *data)
+{
+ if (!count || count > JOBSTATS_JOBID_VAR_MAX_LEN)
+ return -EINVAL;
+
+ memset(obd_jobid_var, 0, JOBSTATS_JOBID_VAR_MAX_LEN + 1);
+ /* Trim the trailing '\n' if any */
+ memcpy(obd_jobid_var, buffer, count - (buffer[count - 1] == '\n'));
+ return count;
+}
+
/* Root for /proc/fs/lustre */
struct proc_dir_entry *proc_lustre_root = NULL;
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 },
- { 0 }
+ { "version", obd_proc_read_version, NULL, NULL },
+ { "pinger", obd_proc_read_pinger, NULL, NULL },
+ { "health_check", obd_proc_read_health, NULL, NULL },
+ { "jobid_var", obd_proc_rd_jobid_var,
+ obd_proc_wr_jobid_var, NULL },
+ { 0 }
};
#else
#define lprocfs_base NULL
}
RETURN(0);
}
-
-
-/* Check that we're building against the appropriate version of the Lustre
- * kernel patch */
-#include <linux/lustre_version.h>
-#ifdef LUSTRE_KERNEL_VERSION
-#define LUSTRE_MIN_VERSION 45
-#define LUSTRE_MAX_VERSION 47
-#if (LUSTRE_KERNEL_VERSION < LUSTRE_MIN_VERSION)
-# error Cannot continue: Your Lustre kernel patch is older than the sources
-#elif (LUSTRE_KERNEL_VERSION > LUSTRE_MAX_VERSION)
-# error Cannot continue: Your Lustre sources are older than the kernel patch
-#endif
-#endif
#endif