summaryrefslogtreecommitdiff
path: root/drivers/infiniband/core/uverbs_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/core/uverbs_main.c')
-rw-r--r--drivers/infiniband/core/uverbs_main.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c
index f5f4bfb59705..c05ce5ae5415 100644
--- a/drivers/infiniband/core/uverbs_main.c
+++ b/drivers/infiniband/core/uverbs_main.c
@@ -161,6 +161,7 @@ static void ib_uverbs_release_dev(struct kobject *kobj)
container_of(kobj, struct ib_uverbs_device, kobj);
cleanup_srcu_struct(&dev->disassociate_srcu);
+ uverbs_free_spec_tree(dev->specs_root);
kfree(dev);
}
@@ -1067,7 +1068,7 @@ static void ib_uverbs_add_one(struct ib_device *device)
if (device_create_file(uverbs_dev->dev, &dev_attr_abi_version))
goto err_class;
- if (!device->specs_root) {
+ if (!device->driver_specs_root) {
const struct uverbs_object_tree_def *default_root[] = {
uverbs_default_get_objects()};
@@ -1075,8 +1076,13 @@ static void ib_uverbs_add_one(struct ib_device *device)
default_root);
if (IS_ERR(uverbs_dev->specs_root))
goto err_class;
-
- device->specs_root = uverbs_dev->specs_root;
+ } else {
+ uverbs_dev->specs_root = device->driver_specs_root;
+ /*
+ * Take responsibility to free the specs allocated by the
+ * driver.
+ */
+ device->driver_specs_root = NULL;
}
ib_set_client_data(device, &uverbs_client, uverbs_dev);
@@ -1241,10 +1247,6 @@ static void ib_uverbs_remove_one(struct ib_device *device, void *client_data)
ib_uverbs_comp_dev(uverbs_dev);
if (wait_clients)
wait_for_completion(&uverbs_dev->comp);
- if (uverbs_dev->specs_root) {
- uverbs_free_spec_tree(uverbs_dev->specs_root);
- device->specs_root = NULL;
- }
kobject_put(&uverbs_dev->kobj);
}