diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-04 11:15:33 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-04 11:15:33 -0500 |
commit | 0f2cc4ecd81dc1917a041dc93db0ada28f8356fa (patch) | |
tree | f128b50f48f50f0cda6d2b20b53e9ad6e2dfded3 /drivers/infiniband | |
parent | 1fae4cfb97302289bb5df6a8195eb28385d0b002 (diff) | |
parent | 9643f5d94aadd47a5fa9754fb60f2c957de05903 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: (52 commits)
init: Open /dev/console from rootfs
mqueue: fix typo "failues" -> "failures"
mqueue: only set error codes if they are really necessary
mqueue: simplify do_open() error handling
mqueue: apply mathematics distributivity on mq_bytes calculation
mqueue: remove unneeded info->messages initialization
mqueue: fix mq_open() file descriptor leak on user-space processes
fix race in d_splice_alias()
set S_DEAD on unlink() and non-directory rename() victims
vfs: add NOFOLLOW flag to umount(2)
get rid of ->mnt_parent in tomoyo/realpath
hppfs can use existing proc_mnt, no need for do_kern_mount() in there
Mirror MS_KERNMOUNT in ->mnt_flags
get rid of useless vfsmount_lock use in put_mnt_ns()
Take vfsmount_lock to fs/internal.h
get rid of insanity with namespace roots in tomoyo
take check for new events in namespace (guts of mounts_poll()) to namespace.c
Don't mess with generic_permission() under ->d_lock in hpfs
sanitize const/signedness for udf
nilfs: sanitize const/signedness in dealing with ->d_name.name
...
Fix up fairly trivial (famous last words...) conflicts in
drivers/infiniband/core/uverbs_main.c and security/tomoyo/realpath.c
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/core/uverbs.h | 2 | ||||
-rw-r--r-- | drivers/infiniband/core/uverbs_cmd.c | 25 | ||||
-rw-r--r-- | drivers/infiniband/core/uverbs_main.c | 24 |
3 files changed, 25 insertions, 26 deletions
diff --git a/drivers/infiniband/core/uverbs.h b/drivers/infiniband/core/uverbs.h index e54d9ac6d1ca..a078e5624d22 100644 --- a/drivers/infiniband/core/uverbs.h +++ b/drivers/infiniband/core/uverbs.h | |||
@@ -146,7 +146,7 @@ extern struct idr ib_uverbs_srq_idr; | |||
146 | void idr_remove_uobj(struct idr *idp, struct ib_uobject *uobj); | 146 | void idr_remove_uobj(struct idr *idp, struct ib_uobject *uobj); |
147 | 147 | ||
148 | struct file *ib_uverbs_alloc_event_file(struct ib_uverbs_file *uverbs_file, | 148 | struct file *ib_uverbs_alloc_event_file(struct ib_uverbs_file *uverbs_file, |
149 | int is_async, int *fd); | 149 | int is_async); |
150 | struct ib_uverbs_event_file *ib_uverbs_lookup_comp_file(int fd); | 150 | struct ib_uverbs_event_file *ib_uverbs_lookup_comp_file(int fd); |
151 | 151 | ||
152 | void ib_uverbs_release_ucq(struct ib_uverbs_file *file, | 152 | void ib_uverbs_release_ucq(struct ib_uverbs_file *file, |
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)) { |
diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c index ff59a795e840..4fa2e6516441 100644 --- a/drivers/infiniband/core/uverbs_main.c +++ b/drivers/infiniband/core/uverbs_main.c | |||
@@ -484,11 +484,10 @@ void ib_uverbs_event_handler(struct ib_event_handler *handler, | |||
484 | } | 484 | } |
485 | 485 | ||
486 | struct file *ib_uverbs_alloc_event_file(struct ib_uverbs_file *uverbs_file, | 486 | struct file *ib_uverbs_alloc_event_file(struct ib_uverbs_file *uverbs_file, |
487 | int is_async, int *fd) | 487 | int is_async) |
488 | { | 488 | { |
489 | struct ib_uverbs_event_file *ev_file; | 489 | struct ib_uverbs_event_file *ev_file; |
490 | struct file *filp; | 490 | struct file *filp; |
491 | int ret; | ||
492 | 491 | ||
493 | ev_file = kmalloc(sizeof *ev_file, GFP_KERNEL); | 492 | ev_file = kmalloc(sizeof *ev_file, GFP_KERNEL); |
494 | if (!ev_file) | 493 | if (!ev_file) |
@@ -503,27 +502,12 @@ struct file *ib_uverbs_alloc_event_file(struct ib_uverbs_file *uverbs_file, | |||
503 | ev_file->is_async = is_async; | 502 | ev_file->is_async = is_async; |
504 | ev_file->is_closed = 0; | 503 | ev_file->is_closed = 0; |
505 | 504 | ||
506 | *fd = get_unused_fd(); | 505 | filp = anon_inode_getfile("[infinibandevent]", &uverbs_event_fops, |
507 | if (*fd < 0) { | ||
508 | ret = *fd; | ||
509 | goto err; | ||
510 | } | ||
511 | |||
512 | filp = anon_inode_getfile("[uverbs-event]", &uverbs_event_fops, | ||
513 | ev_file, O_RDONLY); | 506 | ev_file, O_RDONLY); |
514 | if (!filp) { | 507 | if (IS_ERR(filp)) |
515 | ret = -ENFILE; | 508 | kfree(ev_file); |
516 | goto err_fd; | ||
517 | } | ||
518 | 509 | ||
519 | return filp; | 510 | return filp; |
520 | |||
521 | err_fd: | ||
522 | put_unused_fd(*fd); | ||
523 | |||
524 | err: | ||
525 | kfree(ev_file); | ||
526 | return ERR_PTR(ret); | ||
527 | } | 511 | } |
528 | 512 | ||
529 | /* | 513 | /* |