diff options
| author | Jason Gunthorpe <jgg@mellanox.com> | 2020-05-19 10:27:05 +0300 |
|---|---|---|
| committer | Jason Gunthorpe <jgg@mellanox.com> | 2020-05-21 20:10:46 -0300 |
| commit | 0ac8903cbbe618d947b5815d6e0f7b044ee83aa3 (patch) | |
| tree | 7eeceaf743d60cd7558b2d385c4178f10d0b1047 /drivers/infiniband/core/rdma_core.h | |
| parent | eafd47fc200ee759c0e8d205b9cc7342bd0f4199 (diff) | |
| download | linux-0ac8903cbbe618d947b5815d6e0f7b044ee83aa3.tar.gz linux-0ac8903cbbe618d947b5815d6e0f7b044ee83aa3.tar.bz2 linux-0ac8903cbbe618d947b5815d6e0f7b044ee83aa3.zip | |
RDMA/core: Allow the ioctl layer to abort a fully created uobject
While creating a uobject every create reaches a point where the uobject is
fully initialized. For ioctls that go on to copy_to_user this means they
need to open code the destruction of a fully created uobject - ie the
RDMA_REMOVE_DESTROY sort of flow.
Open coding this creates bugs, eg the CQ does not properly flush the
events list when it does its error unwind.
Provide a uverbs_finalize_uobj_create() function which indicates that the
uobject is fully initialized and that abort should call to destroy_hw to
destroy the uobj->object and related.
Methods can call this function if they go on to have error cases after
setting uobj->object. Once done those error cases can simply do return,
without an error unwind.
Link: https://lore.kernel.org/r/20200519072711.257271-2-leon@kernel.org
Signed-off-by: Yishai Hadas <yishaih@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Diffstat (limited to 'drivers/infiniband/core/rdma_core.h')
| -rw-r--r-- | drivers/infiniband/core/rdma_core.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/infiniband/core/rdma_core.h b/drivers/infiniband/core/rdma_core.h index 33978e0f1262..2b529233e159 100644 --- a/drivers/infiniband/core/rdma_core.h +++ b/drivers/infiniband/core/rdma_core.h @@ -64,8 +64,8 @@ uverbs_get_uobject_from_file(u16 object_id, enum uverbs_obj_access access, s64 id, struct uverbs_attr_bundle *attrs); void uverbs_finalize_object(struct ib_uobject *uobj, - enum uverbs_obj_access access, bool commit, - struct uverbs_attr_bundle *attrs); + enum uverbs_obj_access access, bool hw_obj_valid, + bool commit, struct uverbs_attr_bundle *attrs); int uverbs_output_written(const struct uverbs_attr_bundle *bundle, size_t idx); |
