* 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.
*/
/*
#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>
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 */
+#ifdef HAVE_UNLOCKED_IOCTL
+static long obd_class_ioctl(struct file *filp, unsigned int cmd,
+ unsigned long arg)
+#else
static int obd_class_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
+#endif
{
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,
+#if HAVE_UNLOCKED_IOCTL
+ .unlocked_ioctl = obd_class_ioctl, /* unlocked_ioctl */
+#else
.ioctl = obd_class_ioctl, /* ioctl */
+#endif
.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,