|
@@ -42,7 +42,8 @@
|
|
|
#include <linux/poll.h>
|
|
|
#include <linux/sched.h>
|
|
|
#include <linux/file.h>
|
|
|
-#include <linux/mount.h>
|
|
|
+#include <linux/cdev.h>
|
|
|
+#include <linux/anon_inodes.h>
|
|
|
|
|
|
#include <asm/uaccess.h>
|
|
|
|
|
@@ -52,8 +53,6 @@ MODULE_AUTHOR("Roland Dreier");
|
|
|
MODULE_DESCRIPTION("InfiniBand userspace verbs access");
|
|
|
MODULE_LICENSE("Dual BSD/GPL");
|
|
|
|
|
|
-#define INFINIBANDEVENTFS_MAGIC 0x49426576 /* "IBev" */
|
|
|
-
|
|
|
enum {
|
|
|
IB_UVERBS_MAJOR = 231,
|
|
|
IB_UVERBS_BASE_MINOR = 192,
|
|
@@ -109,8 +108,6 @@ static ssize_t (*uverbs_cmd_table[])(struct ib_uverbs_file *file,
|
|
|
[IB_USER_VERBS_CMD_DESTROY_SRQ] = ib_uverbs_destroy_srq,
|
|
|
};
|
|
|
|
|
|
-static struct vfsmount *uverbs_event_mnt;
|
|
|
-
|
|
|
static void ib_uverbs_add_one(struct ib_device *device);
|
|
|
static void ib_uverbs_remove_one(struct ib_device *device);
|
|
|
|
|
@@ -490,7 +487,6 @@ struct file *ib_uverbs_alloc_event_file(struct ib_uverbs_file *uverbs_file,
|
|
|
int is_async, int *fd)
|
|
|
{
|
|
|
struct ib_uverbs_event_file *ev_file;
|
|
|
- struct path path;
|
|
|
struct file *filp;
|
|
|
int ret;
|
|
|
|
|
@@ -513,27 +509,16 @@ struct file *ib_uverbs_alloc_event_file(struct ib_uverbs_file *uverbs_file,
|
|
|
goto err;
|
|
|
}
|
|
|
|
|
|
- /*
|
|
|
- * fops_get() can't fail here, because we're coming from a
|
|
|
- * system call on a uverbs file, which will already have a
|
|
|
- * module reference.
|
|
|
- */
|
|
|
- path.mnt = uverbs_event_mnt;
|
|
|
- path.dentry = uverbs_event_mnt->mnt_root;
|
|
|
- path_get(&path);
|
|
|
- filp = alloc_file(&path, FMODE_READ, fops_get(&uverbs_event_fops));
|
|
|
+ filp = anon_inode_getfile("[uverbs-event]", &uverbs_event_fops,
|
|
|
+ ev_file, O_RDONLY);
|
|
|
if (!filp) {
|
|
|
ret = -ENFILE;
|
|
|
goto err_fd;
|
|
|
}
|
|
|
|
|
|
- filp->private_data = ev_file;
|
|
|
-
|
|
|
return filp;
|
|
|
|
|
|
err_fd:
|
|
|
- fops_put(&uverbs_event_fops);
|
|
|
- path_put(&path);
|
|
|
put_unused_fd(*fd);
|
|
|
|
|
|
err:
|
|
@@ -854,21 +839,6 @@ static void ib_uverbs_remove_one(struct ib_device *device)
|
|
|
kfree(uverbs_dev);
|
|
|
}
|
|
|
|
|
|
-static int uverbs_event_get_sb(struct file_system_type *fs_type, int flags,
|
|
|
- const char *dev_name, void *data,
|
|
|
- struct vfsmount *mnt)
|
|
|
-{
|
|
|
- return get_sb_pseudo(fs_type, "infinibandevent:", NULL,
|
|
|
- INFINIBANDEVENTFS_MAGIC, mnt);
|
|
|
-}
|
|
|
-
|
|
|
-static struct file_system_type uverbs_event_fs = {
|
|
|
- /* No owner field so module can be unloaded */
|
|
|
- .name = "infinibandeventfs",
|
|
|
- .get_sb = uverbs_event_get_sb,
|
|
|
- .kill_sb = kill_litter_super
|
|
|
-};
|
|
|
-
|
|
|
static int __init ib_uverbs_init(void)
|
|
|
{
|
|
|
int ret;
|
|
@@ -893,33 +863,14 @@ static int __init ib_uverbs_init(void)
|
|
|
goto out_class;
|
|
|
}
|
|
|
|
|
|
- ret = register_filesystem(&uverbs_event_fs);
|
|
|
- if (ret) {
|
|
|
- printk(KERN_ERR "user_verbs: couldn't register infinibandeventfs\n");
|
|
|
- goto out_class;
|
|
|
- }
|
|
|
-
|
|
|
- uverbs_event_mnt = kern_mount(&uverbs_event_fs);
|
|
|
- if (IS_ERR(uverbs_event_mnt)) {
|
|
|
- ret = PTR_ERR(uverbs_event_mnt);
|
|
|
- printk(KERN_ERR "user_verbs: couldn't mount infinibandeventfs\n");
|
|
|
- goto out_fs;
|
|
|
- }
|
|
|
-
|
|
|
ret = ib_register_client(&uverbs_client);
|
|
|
if (ret) {
|
|
|
printk(KERN_ERR "user_verbs: couldn't register client\n");
|
|
|
- goto out_mnt;
|
|
|
+ goto out_class;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
-out_mnt:
|
|
|
- mntput(uverbs_event_mnt);
|
|
|
-
|
|
|
-out_fs:
|
|
|
- unregister_filesystem(&uverbs_event_fs);
|
|
|
-
|
|
|
out_class:
|
|
|
class_destroy(uverbs_class);
|
|
|
|
|
@@ -933,8 +884,6 @@ out:
|
|
|
static void __exit ib_uverbs_cleanup(void)
|
|
|
{
|
|
|
ib_unregister_client(&uverbs_client);
|
|
|
- mntput(uverbs_event_mnt);
|
|
|
- unregister_filesystem(&uverbs_event_fs);
|
|
|
class_destroy(uverbs_class);
|
|
|
unregister_chrdev_region(IB_UVERBS_BASE_DEV, IB_UVERBS_MAX_DEVICES);
|
|
|
if (overflow_maj)
|