aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/core/uverbs_cmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/core/uverbs_cmd.c')
-rw-r--r--drivers/infiniband/core/uverbs_cmd.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
index 112d3970222a..f71cf138d674 100644
--- a/drivers/infiniband/core/uverbs_cmd.c
+++ b/drivers/infiniband/core/uverbs_cmd.c
@@ -301,10 +301,15 @@ ssize_t ib_uverbs_get_context(struct ib_uverbs_file *file,
301 301
302 resp.num_comp_vectors = file->device->num_comp_vectors; 302 resp.num_comp_vectors = file->device->num_comp_vectors;
303 303
304 filp = ib_uverbs_alloc_event_file(file, 1, &resp.async_fd); 304 ret = get_unused_fd();
305 if (ret < 0)
306 goto err_free;
307 resp.async_fd = ret;
308
309 filp = ib_uverbs_alloc_event_file(file, 1);
305 if (IS_ERR(filp)) { 310 if (IS_ERR(filp)) {
306 ret = PTR_ERR(filp); 311 ret = PTR_ERR(filp);
307 goto err_free; 312 goto err_fd;
308 } 313 }
309 314
310 if (copy_to_user((void __user *) (unsigned long) cmd.response, 315 if (copy_to_user((void __user *) (unsigned long) cmd.response,
@@ -332,9 +337,11 @@ ssize_t ib_uverbs_get_context(struct ib_uverbs_file *file,
332 return in_len; 337 return in_len;
333 338
334err_file: 339err_file:
335 put_unused_fd(resp.async_fd);
336 fput(filp); 340 fput(filp);
337 341
342err_fd:
343 put_unused_fd(resp.async_fd);
344
338err_free: 345err_free:
339 ibdev->dealloc_ucontext(ucontext); 346 ibdev->dealloc_ucontext(ucontext);
340 347
@@ -715,6 +722,7 @@ ssize_t ib_uverbs_create_comp_channel(struct ib_uverbs_file *file,
715 struct ib_uverbs_create_comp_channel cmd; 722 struct ib_uverbs_create_comp_channel cmd;
716 struct ib_uverbs_create_comp_channel_resp resp; 723 struct ib_uverbs_create_comp_channel_resp resp;
717 struct file *filp; 724 struct file *filp;
725 int ret;
718 726
719 if (out_len < sizeof resp) 727 if (out_len < sizeof resp)
720 return -ENOSPC; 728 return -ENOSPC;
@@ -722,9 +730,16 @@ ssize_t ib_uverbs_create_comp_channel(struct ib_uverbs_file *file,
722 if (copy_from_user(&cmd, buf, sizeof cmd)) 730 if (copy_from_user(&cmd, buf, sizeof cmd))
723 return -EFAULT; 731 return -EFAULT;
724 732
725 filp = ib_uverbs_alloc_event_file(file, 0, &resp.fd); 733 ret = get_unused_fd();
726 if (IS_ERR(filp)) 734 if (ret < 0)
735 return ret;
736 resp.fd = ret;
737
738 filp = ib_uverbs_alloc_event_file(file, 0);
739 if (IS_ERR(filp)) {
740 put_unused_fd(resp.fd);
727 return PTR_ERR(filp); 741 return PTR_ERR(filp);
742 }
728 743
729 if (copy_to_user((void __user *) (unsigned long) cmd.response, 744 if (copy_to_user((void __user *) (unsigned long) cmd.response,
730 &resp, sizeof resp)) { 745 &resp, sizeof resp)) {