diff options
-rw-r--r-- | include/linux/eventfd.h | 3 | ||||
-rw-r--r-- | kernel/cgroup.c | 33 |
2 files changed, 19 insertions, 17 deletions
diff --git a/include/linux/eventfd.h b/include/linux/eventfd.h index cf5d2af61b81..ff0b981f078e 100644 --- a/include/linux/eventfd.h +++ b/include/linux/eventfd.h | |||
@@ -9,7 +9,6 @@ | |||
9 | #define _LINUX_EVENTFD_H | 9 | #define _LINUX_EVENTFD_H |
10 | 10 | ||
11 | #include <linux/fcntl.h> | 11 | #include <linux/fcntl.h> |
12 | #include <linux/file.h> | ||
13 | #include <linux/wait.h> | 12 | #include <linux/wait.h> |
14 | 13 | ||
15 | /* | 14 | /* |
@@ -26,6 +25,8 @@ | |||
26 | #define EFD_SHARED_FCNTL_FLAGS (O_CLOEXEC | O_NONBLOCK) | 25 | #define EFD_SHARED_FCNTL_FLAGS (O_CLOEXEC | O_NONBLOCK) |
27 | #define EFD_FLAGS_SET (EFD_SHARED_FCNTL_FLAGS | EFD_SEMAPHORE) | 26 | #define EFD_FLAGS_SET (EFD_SHARED_FCNTL_FLAGS | EFD_SEMAPHORE) |
28 | 27 | ||
28 | struct file; | ||
29 | |||
29 | #ifdef CONFIG_EVENTFD | 30 | #ifdef CONFIG_EVENTFD |
30 | 31 | ||
31 | struct file *eventfd_file_create(unsigned int count, int flags); | 32 | struct file *eventfd_file_create(unsigned int count, int flags); |
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index e0aeb32415ff..2418b6e71a85 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
@@ -60,6 +60,7 @@ | |||
60 | #include <linux/poll.h> | 60 | #include <linux/poll.h> |
61 | #include <linux/flex_array.h> /* used in cgroup_attach_task */ | 61 | #include <linux/flex_array.h> /* used in cgroup_attach_task */ |
62 | #include <linux/kthread.h> | 62 | #include <linux/kthread.h> |
63 | #include <linux/file.h> | ||
63 | 64 | ||
64 | #include <linux/atomic.h> | 65 | #include <linux/atomic.h> |
65 | 66 | ||
@@ -4034,8 +4035,8 @@ static int cgroup_write_event_control(struct cgroup_subsys_state *dummy_css, | |||
4034 | struct cgroup_event *event; | 4035 | struct cgroup_event *event; |
4035 | struct cgroup_subsys_state *cfile_css; | 4036 | struct cgroup_subsys_state *cfile_css; |
4036 | unsigned int efd, cfd; | 4037 | unsigned int efd, cfd; |
4037 | struct file *efile; | 4038 | struct fd efile; |
4038 | struct file *cfile; | 4039 | struct fd cfile; |
4039 | char *endp; | 4040 | char *endp; |
4040 | int ret; | 4041 | int ret; |
4041 | 4042 | ||
@@ -4058,31 +4059,31 @@ static int cgroup_write_event_control(struct cgroup_subsys_state *dummy_css, | |||
4058 | init_waitqueue_func_entry(&event->wait, cgroup_event_wake); | 4059 | init_waitqueue_func_entry(&event->wait, cgroup_event_wake); |
4059 | INIT_WORK(&event->remove, cgroup_event_remove); | 4060 | INIT_WORK(&event->remove, cgroup_event_remove); |
4060 | 4061 | ||
4061 | efile = eventfd_fget(efd); | 4062 | efile = fdget(efd); |
4062 | if (IS_ERR(efile)) { | 4063 | if (!efile.file) { |
4063 | ret = PTR_ERR(efile); | 4064 | ret = -EBADF; |
4064 | goto out_kfree; | 4065 | goto out_kfree; |
4065 | } | 4066 | } |
4066 | 4067 | ||
4067 | event->eventfd = eventfd_ctx_fileget(efile); | 4068 | event->eventfd = eventfd_ctx_fileget(efile.file); |
4068 | if (IS_ERR(event->eventfd)) { | 4069 | if (IS_ERR(event->eventfd)) { |
4069 | ret = PTR_ERR(event->eventfd); | 4070 | ret = PTR_ERR(event->eventfd); |
4070 | goto out_put_efile; | 4071 | goto out_put_efile; |
4071 | } | 4072 | } |
4072 | 4073 | ||
4073 | cfile = fget(cfd); | 4074 | cfile = fdget(cfd); |
4074 | if (!cfile) { | 4075 | if (!cfile.file) { |
4075 | ret = -EBADF; | 4076 | ret = -EBADF; |
4076 | goto out_put_eventfd; | 4077 | goto out_put_eventfd; |
4077 | } | 4078 | } |
4078 | 4079 | ||
4079 | /* the process need read permission on control file */ | 4080 | /* the process need read permission on control file */ |
4080 | /* AV: shouldn't we check that it's been opened for read instead? */ | 4081 | /* AV: shouldn't we check that it's been opened for read instead? */ |
4081 | ret = inode_permission(file_inode(cfile), MAY_READ); | 4082 | ret = inode_permission(file_inode(cfile.file), MAY_READ); |
4082 | if (ret < 0) | 4083 | if (ret < 0) |
4083 | goto out_put_cfile; | 4084 | goto out_put_cfile; |
4084 | 4085 | ||
4085 | event->cft = __file_cft(cfile); | 4086 | event->cft = __file_cft(cfile.file); |
4086 | if (IS_ERR(event->cft)) { | 4087 | if (IS_ERR(event->cft)) { |
4087 | ret = PTR_ERR(event->cft); | 4088 | ret = PTR_ERR(event->cft); |
4088 | goto out_put_cfile; | 4089 | goto out_put_cfile; |
@@ -4103,7 +4104,7 @@ static int cgroup_write_event_control(struct cgroup_subsys_state *dummy_css, | |||
4103 | 4104 | ||
4104 | ret = -EINVAL; | 4105 | ret = -EINVAL; |
4105 | event->css = cgroup_css(cgrp, event->cft->ss); | 4106 | event->css = cgroup_css(cgrp, event->cft->ss); |
4106 | cfile_css = css_from_dir(cfile->f_dentry->d_parent, event->cft->ss); | 4107 | cfile_css = css_from_dir(cfile.file->f_dentry->d_parent, event->cft->ss); |
4107 | if (event->css && event->css == cfile_css && css_tryget(event->css)) | 4108 | if (event->css && event->css == cfile_css && css_tryget(event->css)) |
4108 | ret = 0; | 4109 | ret = 0; |
4109 | 4110 | ||
@@ -4121,25 +4122,25 @@ static int cgroup_write_event_control(struct cgroup_subsys_state *dummy_css, | |||
4121 | if (ret) | 4122 | if (ret) |
4122 | goto out_put_css; | 4123 | goto out_put_css; |
4123 | 4124 | ||
4124 | efile->f_op->poll(efile, &event->pt); | 4125 | efile.file->f_op->poll(efile.file, &event->pt); |
4125 | 4126 | ||
4126 | spin_lock(&cgrp->event_list_lock); | 4127 | spin_lock(&cgrp->event_list_lock); |
4127 | list_add(&event->list, &cgrp->event_list); | 4128 | list_add(&event->list, &cgrp->event_list); |
4128 | spin_unlock(&cgrp->event_list_lock); | 4129 | spin_unlock(&cgrp->event_list_lock); |
4129 | 4130 | ||
4130 | fput(cfile); | 4131 | fdput(cfile); |
4131 | fput(efile); | 4132 | fdput(efile); |
4132 | 4133 | ||
4133 | return 0; | 4134 | return 0; |
4134 | 4135 | ||
4135 | out_put_css: | 4136 | out_put_css: |
4136 | css_put(event->css); | 4137 | css_put(event->css); |
4137 | out_put_cfile: | 4138 | out_put_cfile: |
4138 | fput(cfile); | 4139 | fdput(cfile); |
4139 | out_put_eventfd: | 4140 | out_put_eventfd: |
4140 | eventfd_ctx_put(event->eventfd); | 4141 | eventfd_ctx_put(event->eventfd); |
4141 | out_put_efile: | 4142 | out_put_efile: |
4142 | fput(efile); | 4143 | fdput(efile); |
4143 | out_kfree: | 4144 | out_kfree: |
4144 | kfree(event); | 4145 | kfree(event); |
4145 | 4146 | ||