diff options
Diffstat (limited to 'drivers/infiniband/core/uverbs_cmd.c')
-rw-r--r-- | drivers/infiniband/core/uverbs_cmd.c | 25 |
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 | ||
334 | err_file: | 339 | err_file: |
335 | put_unused_fd(resp.async_fd); | ||
336 | fput(filp); | 340 | fput(filp); |
337 | 341 | ||
342 | err_fd: | ||
343 | put_unused_fd(resp.async_fd); | ||
344 | |||
338 | err_free: | 345 | err_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)) { |