@@ -73,11 +73,9 @@ static void mdev_put_parent(struct mdev_parent *parent)
static void mdev_device_remove_common(struct mdev_device *mdev)
{
struct mdev_parent *parent;
- struct mdev_type *type;
int ret;
- type = to_mdev_type(mdev->type_kobj);
- mdev_remove_sysfs_files(mdev, type);
+ mdev_remove_sysfs_files(mdev);
device_del(&mdev->dev);
parent = mdev->parent;
lockdep_assert_held(&parent->unreg_sem);
@@ -241,13 +239,11 @@ static void mdev_device_release(struct device *dev)
mdev_device_free(mdev);
}
-int mdev_device_create(struct kobject *kobj,
- struct device *dev, const guid_t *uuid)
+int mdev_device_create(struct mdev_type *type, const guid_t *uuid)
{
int ret;
struct mdev_device *mdev, *tmp;
struct mdev_parent *parent;
- struct mdev_type *type = to_mdev_type(kobj);
parent = mdev_get_parent(type->parent);
if (!parent)
@@ -285,14 +281,14 @@ int mdev_device_create(struct kobject *kobj,
}
device_initialize(&mdev->dev);
- mdev->dev.parent = dev;
+ mdev->dev.parent = parent->dev;
mdev->dev.bus = &mdev_bus_type;
mdev->dev.release = mdev_device_release;
dev_set_name(&mdev->dev, "%pUl", uuid);
mdev->dev.groups = parent->ops->mdev_attr_groups;
- mdev->type_kobj = kobj;
+ mdev->type = type;
- ret = parent->ops->create(kobj, mdev);
+ ret = parent->ops->create(&type->kobj, mdev);
if (ret)
goto ops_create_fail;
@@ -300,7 +296,7 @@ int mdev_device_create(struct kobject *kobj,
if (ret)
goto add_fail;
- ret = mdev_create_sysfs_files(mdev, type);
+ ret = mdev_create_sysfs_files(mdev);
if (ret)
goto sysfs_fail;
@@ -40,11 +40,10 @@ struct mdev_type {
int parent_create_sysfs_files(struct mdev_parent *parent);
void parent_remove_sysfs_files(struct mdev_parent *parent);
-int mdev_create_sysfs_files(struct mdev_device *mdev, struct mdev_type *type);
-void mdev_remove_sysfs_files(struct mdev_device *mdev, struct mdev_type *type);
+int mdev_create_sysfs_files(struct mdev_device *mdev);
+void mdev_remove_sysfs_files(struct mdev_device *mdev);
-int mdev_device_create(struct kobject *kobj,
- struct device *dev, const guid_t *uuid);
+int mdev_device_create(struct mdev_type *kobj, const guid_t *uuid);
int mdev_device_remove(struct mdev_device *dev);
#endif /* MDEV_PRIVATE_H */
@@ -67,7 +67,7 @@ static ssize_t create_store(struct kobject *kobj, struct device *dev,
if (ret)
return ret;
- ret = mdev_device_create(kobj, dev, &uuid);
+ ret = mdev_device_create(to_mdev_type(kobj), &uuid);
if (ret)
return ret;
@@ -249,8 +249,9 @@ static const struct attribute *mdev_device_attrs[] = {
NULL,
};
-int mdev_create_sysfs_files(struct mdev_device *mdev, struct mdev_type *type)
+int mdev_create_sysfs_files(struct mdev_device *mdev)
{
+ struct mdev_type *type = mdev->type;
struct kobject *kobj = &mdev->dev.kobj;
int ret;
@@ -271,15 +272,15 @@ int mdev_create_sysfs_files(struct mdev_device *mdev, struct mdev_type *type)
create_files_failed:
sysfs_remove_link(kobj, "mdev_type");
type_link_failed:
- sysfs_remove_link(type->devices_kobj, dev_name(&mdev->dev));
+ sysfs_remove_link(mdev->type->devices_kobj, dev_name(&mdev->dev));
return ret;
}
-void mdev_remove_sysfs_files(struct mdev_device *mdev, struct mdev_type *type)
+void mdev_remove_sysfs_files(struct mdev_device *mdev)
{
struct kobject *kobj = &mdev->dev.kobj;
sysfs_remove_files(kobj, mdev_device_attrs);
sysfs_remove_link(kobj, "mdev_type");
- sysfs_remove_link(type->devices_kobj, dev_name(&mdev->dev));
+ sysfs_remove_link(mdev->type->devices_kobj, dev_name(&mdev->dev));
}
@@ -10,13 +10,15 @@
#ifndef MDEV_H
#define MDEV_H
+struct mdev_type;
+
struct mdev_device {
struct device dev;
struct mdev_parent *parent;
guid_t uuid;
void *driver_data;
struct list_head next;
- struct kobject *type_kobj;
+ struct mdev_type *type;
struct device *iommu_device;
bool active;
};