#include <linux/anon_inodes.h>
#include "vfio.h"
+static char *vfio_devnode(const struct device *, umode_t *);
+static const struct class vfio_class = {
+ .name = "vfio",
+ .devnode = vfio_devnode
+};
+
static struct vfio {
- struct class *class;
struct list_head group_list;
struct mutex group_lock; /* locks group_list */
struct ida group_ida;
device_initialize(&group->dev);
group->dev.devt = MKDEV(MAJOR(vfio.group_devt), minor);
- group->dev.class = vfio.class;
+ group->dev.class = &vfio_class;
group->dev.release = vfio_group_release;
cdev_init(&group->cdev, &vfio_group_fops);
group->cdev.owner = THIS_MODULE;
return ret;
/* /dev/vfio/$GROUP */
- vfio.class = class_create("vfio");
- if (IS_ERR(vfio.class)) {
- ret = PTR_ERR(vfio.class);
+ ret = class_register(&vfio_class);
+ if (ret)
goto err_group_class;
- }
-
- vfio.class->devnode = vfio_devnode;
ret = alloc_chrdev_region(&vfio.group_devt, 0, MINORMASK + 1, "vfio");
if (ret)
return 0;
err_alloc_chrdev:
- class_destroy(vfio.class);
- vfio.class = NULL;
+ class_unregister(&vfio_class);
err_group_class:
vfio_container_cleanup();
return ret;
WARN_ON(!list_empty(&vfio.group_list));
ida_destroy(&vfio.group_ida);
unregister_chrdev_region(vfio.group_devt, MINORMASK + 1);
- class_destroy(vfio.class);
- vfio.class = NULL;
+ class_unregister(&vfio_class);
vfio_container_cleanup();
}