diff options
author | Jack Morgenstein <jackm@mellanox.co.il> | 2006-01-06 19:43:14 -0500 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2006-01-06 19:43:14 -0500 |
commit | ac4e7b35579de55db50d602a472858867808a9c3 (patch) | |
tree | 09680302ee8c821bdea085af19d1d3b50ebcb4a9 /drivers/infiniband | |
parent | ea5d4a6ad2bfd1006790666981645cab43d3afbd (diff) |
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>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/core/uverbs_cmd.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index 12d6cc0a7f80..a02c5a05c984 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c | |||
@@ -594,13 +594,18 @@ ssize_t ib_uverbs_create_cq(struct ib_uverbs_file *file, | |||
594 | if (cmd.comp_vector >= file->device->num_comp_vectors) | 594 | if (cmd.comp_vector >= file->device->num_comp_vectors) |
595 | return -EINVAL; | 595 | return -EINVAL; |
596 | 596 | ||
597 | if (cmd.comp_channel >= 0) | ||
598 | ev_file = ib_uverbs_lookup_comp_file(cmd.comp_channel); | ||
599 | |||
600 | uobj = kmalloc(sizeof *uobj, GFP_KERNEL); | 597 | uobj = kmalloc(sizeof *uobj, GFP_KERNEL); |
601 | if (!uobj) | 598 | if (!uobj) |
602 | return -ENOMEM; | 599 | return -ENOMEM; |
603 | 600 | ||
601 | if (cmd.comp_channel >= 0) { | ||
602 | ev_file = ib_uverbs_lookup_comp_file(cmd.comp_channel); | ||
603 | if (!ev_file) { | ||
604 | ret = -EINVAL; | ||
605 | goto err; | ||
606 | } | ||
607 | } | ||
608 | |||
604 | uobj->uobject.user_handle = cmd.user_handle; | 609 | uobj->uobject.user_handle = cmd.user_handle; |
605 | uobj->uobject.context = file->ucontext; | 610 | uobj->uobject.context = file->ucontext; |
606 | uobj->uverbs_file = file; | 611 | uobj->uverbs_file = file; |
@@ -664,6 +669,8 @@ err_up: | |||
664 | ib_destroy_cq(cq); | 669 | ib_destroy_cq(cq); |
665 | 670 | ||
666 | err: | 671 | err: |
672 | if (ev_file) | ||
673 | ib_uverbs_release_ucq(file, ev_file, uobj); | ||
667 | kfree(uobj); | 674 | kfree(uobj); |
668 | return ret; | 675 | return ret; |
669 | } | 676 | } |