]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
eventfd: convert to use anon_inode_getfd()
authorEric Biggers <ebiggers@google.com>
Sat, 6 Jan 2018 17:45:42 +0000 (09:45 -0800)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 6 Jan 2018 18:47:20 +0000 (13:47 -0500)
Nothing actually calls eventfd_file_create() besides the eventfd2()
system call itself.  So simplify things by folding it into the system
call and using anon_inode_getfd() instead of anon_inode_getfile().  This
removes over 40 lines with no change in functionality.

(eventfd_file_create() was apparently added years ago for KVM irqfd's,
but was never used.)

Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/eventfd.c
include/linux/eventfd.h

index 2fb4eadaa1181e4c4f4178b7269c20f58b03a376..4167e670ed4d399184511d6c0604c5e0775795e1 100644 (file)
@@ -412,72 +412,33 @@ struct eventfd_ctx *eventfd_ctx_fileget(struct file *file)
 }
 EXPORT_SYMBOL_GPL(eventfd_ctx_fileget);
 
-/**
- * eventfd_file_create - Creates an eventfd file pointer.
- * @count: Initial eventfd counter value.
- * @flags: Flags for the eventfd file.
- *
- * This function creates an eventfd file pointer, w/out installing it into
- * the fd table. This is useful when the eventfd file is used during the
- * initialization of data structures that require extra setup after the eventfd
- * creation. So the eventfd creation is split into the file pointer creation
- * phase, and the file descriptor installation phase.
- * In this way races with userspace closing the newly installed file descriptor
- * can be avoided.
- * Returns an eventfd file pointer, or a proper error pointer.
- */
-struct file *eventfd_file_create(unsigned int count, int flags)
+SYSCALL_DEFINE2(eventfd2, unsigned int, count, int, flags)
 {
-       struct file *file;
        struct eventfd_ctx *ctx;
+       int fd;
 
        /* Check the EFD_* constants for consistency.  */
        BUILD_BUG_ON(EFD_CLOEXEC != O_CLOEXEC);
        BUILD_BUG_ON(EFD_NONBLOCK != O_NONBLOCK);
 
        if (flags & ~EFD_FLAGS_SET)
-               return ERR_PTR(-EINVAL);
+               return -EINVAL;
 
        ctx = kmalloc(sizeof(*ctx), GFP_KERNEL);
        if (!ctx)
-               return ERR_PTR(-ENOMEM);
+               return -ENOMEM;
 
        kref_init(&ctx->kref);
        init_waitqueue_head(&ctx->wqh);
        ctx->count = count;
        ctx->flags = flags;
 
-       file = anon_inode_getfile("[eventfd]", &eventfd_fops, ctx,
-                                 O_RDWR | (flags & EFD_SHARED_FCNTL_FLAGS));
-       if (IS_ERR(file))
+       fd = anon_inode_getfd("[eventfd]", &eventfd_fops, ctx,
+                             O_RDWR | (flags & EFD_SHARED_FCNTL_FLAGS));
+       if (fd < 0)
                eventfd_free_ctx(ctx);
 
-       return file;
-}
-
-SYSCALL_DEFINE2(eventfd2, unsigned int, count, int, flags)
-{
-       int fd, error;
-       struct file *file;
-
-       error = get_unused_fd_flags(flags & EFD_SHARED_FCNTL_FLAGS);
-       if (error < 0)
-               return error;
-       fd = error;
-
-       file = eventfd_file_create(count, flags);
-       if (IS_ERR(file)) {
-               error = PTR_ERR(file);
-               goto err_put_unused_fd;
-       }
-       fd_install(fd, file);
-
        return fd;
-
-err_put_unused_fd:
-       put_unused_fd(fd);
-
-       return error;
 }
 
 SYSCALL_DEFINE1(eventfd, unsigned int, count)
index 60b2985e8a184764ba7c5031985052c1a2f66f52..15826192cc2307fdfd9171cd87f356528b22e495 100644 (file)
@@ -30,7 +30,6 @@ struct file;
 
 #ifdef CONFIG_EVENTFD
 
-struct file *eventfd_file_create(unsigned int count, int flags);
 struct eventfd_ctx *eventfd_ctx_get(struct eventfd_ctx *ctx);
 void eventfd_ctx_put(struct eventfd_ctx *ctx);
 struct file *eventfd_fget(int fd);
@@ -47,10 +46,6 @@ int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx, wait_queue_entry_t *w
  * Ugly ugly ugly error layer to support modules that uses eventfd but
  * pretend to work in !CONFIG_EVENTFD configurations. Namely, AIO.
  */
-static inline struct file *eventfd_file_create(unsigned int count, int flags)
-{
-       return ERR_PTR(-ENOSYS);
-}
 
 static inline struct eventfd_ctx *eventfd_ctx_fdget(int fd)
 {