IB/uverbs: Release event file reference on ib_uverbs_create_cq() error
ib_uverbs_create_cq() should release the completion channel event file if an error occurs after it looks it up. Also, if userspace asks for a completion channel and we don't find it, an error should be returned instead of silently creating a CQ without a completion channel. Signed-off-by: Jack Morgenstein <jackm@mellanox.co.il> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
committed by
Roland Dreier
parent
ea5d4a6ad2
commit
ac4e7b3557
@@ -594,13 +594,18 @@ ssize_t ib_uverbs_create_cq(struct ib_uverbs_file *file,
|
|||||||
if (cmd.comp_vector >= file->device->num_comp_vectors)
|
if (cmd.comp_vector >= file->device->num_comp_vectors)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (cmd.comp_channel >= 0)
|
|
||||||
ev_file = ib_uverbs_lookup_comp_file(cmd.comp_channel);
|
|
||||||
|
|
||||||
uobj = kmalloc(sizeof *uobj, GFP_KERNEL);
|
uobj = kmalloc(sizeof *uobj, GFP_KERNEL);
|
||||||
if (!uobj)
|
if (!uobj)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
if (cmd.comp_channel >= 0) {
|
||||||
|
ev_file = ib_uverbs_lookup_comp_file(cmd.comp_channel);
|
||||||
|
if (!ev_file) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uobj->uobject.user_handle = cmd.user_handle;
|
uobj->uobject.user_handle = cmd.user_handle;
|
||||||
uobj->uobject.context = file->ucontext;
|
uobj->uobject.context = file->ucontext;
|
||||||
uobj->uverbs_file = file;
|
uobj->uverbs_file = file;
|
||||||
@@ -664,6 +669,8 @@ err_up:
|
|||||||
ib_destroy_cq(cq);
|
ib_destroy_cq(cq);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
|
if (ev_file)
|
||||||
|
ib_uverbs_release_ucq(file, ev_file, uobj);
|
||||||
kfree(uobj);
|
kfree(uobj);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user