aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/eventfd.h3
-rw-r--r--kernel/cgroup.c33
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
28struct file;
29
29#ifdef CONFIG_EVENTFD 30#ifdef CONFIG_EVENTFD
30 31
31struct file *eventfd_file_create(unsigned int count, int flags); 32struct 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
4135out_put_css: 4136out_put_css:
4136 css_put(event->css); 4137 css_put(event->css);
4137out_put_cfile: 4138out_put_cfile:
4138 fput(cfile); 4139 fdput(cfile);
4139out_put_eventfd: 4140out_put_eventfd:
4140 eventfd_ctx_put(event->eventfd); 4141 eventfd_ctx_put(event->eventfd);
4141out_put_efile: 4142out_put_efile:
4142 fput(efile); 4143 fdput(efile);
4143out_kfree: 4144out_kfree:
4144 kfree(event); 4145 kfree(event);
4145 4146