* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2012, Intel Corporation.
+ * Copyright (c) 2012, 2014, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
RETURN(-EINVAL);
}
- if (hdr.ioc_len < sizeof(struct libcfs_ioctl_data)) {
+ if (hdr.ioc_len < sizeof(struct libcfs_ioctl_hdr)) {
CERROR("libcfs ioctl: user buffer too small for ioctl\n");
RETURN(-EINVAL);
}
RETURN(0);
failed:
- libcfs_ioctl_freedata(*hdr_pp);
+ LIBCFS_FREE(*hdr_pp, hdr.ioc_len);
RETURN(err);
}
-extern struct cfs_psdev_ops libcfs_psdev_ops;
-
static int
libcfs_psdev_open(struct inode * inode, struct file * file)
{
- struct libcfs_device_userstate **pdu = NULL;
- int rc = 0;
-
if (!inode)
- return (-EINVAL);
- pdu = (struct libcfs_device_userstate **)&file->private_data;
- if (libcfs_psdev_ops.p_open != NULL)
- rc = libcfs_psdev_ops.p_open(0, (void *)pdu);
- else
- return (-EPERM);
- return rc;
+ return -EINVAL;
+
+ try_module_get(THIS_MODULE);
+ return 0;
}
/* called when closing /dev/device */
static int
libcfs_psdev_release(struct inode * inode, struct file * file)
{
- struct libcfs_device_userstate *pdu;
- int rc = 0;
-
if (!inode)
- return (-EINVAL);
- pdu = file->private_data;
- if (libcfs_psdev_ops.p_close != NULL)
- rc = libcfs_psdev_ops.p_close(0, (void *)pdu);
- else
- rc = -EPERM;
- return rc;
+ return -EINVAL;
+
+ module_put(THIS_MODULE);
+ return 0;
}
-static long libcfs_ioctl(struct file *file,
- unsigned int cmd, unsigned long arg)
+static long
+libcfs_psdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
- struct cfs_psdev_file pfile;
- int rc = 0;
-
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
_IOC_NR(cmd) > IOC_LIBCFS_MAX_NR) {
CDEBUG(D_IOCTL, "invalid ioctl ( type %d, nr %d, size %d )\n",
_IOC_TYPE(cmd), _IOC_NR(cmd), _IOC_SIZE(cmd));
- return (-EINVAL);
- }
-
- /* Handle platform-dependent IOC requests */
- switch (cmd) {
- case IOC_LIBCFS_PANIC:
- if (!cfs_capable(CFS_CAP_SYS_BOOT))
- return (-EPERM);
- panic("debugctl-invoked panic");
- return (0);
- case IOC_LIBCFS_MEMHOG:
- if (!cfs_capable(CFS_CAP_SYS_ADMIN))
- return -EPERM;
- /* go thought */
+ return -EINVAL;
}
- pfile.off = 0;
- pfile.private_data = file->private_data;
- if (libcfs_psdev_ops.p_ioctl != NULL)
- rc = libcfs_psdev_ops.p_ioctl(&pfile, cmd, (void __user *)arg);
- else
- rc = -EPERM;
- return (rc);
+ return libcfs_ioctl(cmd, (void __user *)arg);
}
static struct file_operations libcfs_fops = {
- unlocked_ioctl: libcfs_ioctl,
- open : libcfs_psdev_open,
- release : libcfs_psdev_release
+ .unlocked_ioctl = libcfs_psdev_ioctl,
+ .open = libcfs_psdev_open,
+ .release = libcfs_psdev_release
};
struct miscdevice libcfs_dev = {