struct io_ev_fd {
        struct eventfd_ctx      *cq_ev_fd;
+       unsigned int            eventfd_async: 1;
        struct rcu_head         rcu;
 };
 
                unsigned int            flags;
                unsigned int            compat: 1;
                unsigned int            drain_next: 1;
-               unsigned int            eventfd_async: 1;
                unsigned int            restricted: 1;
                unsigned int            off_timeout_used: 1;
                unsigned int            drain_active: 1;
        if (READ_ONCE(ctx->rings->cq_flags) & IORING_CQ_EVENTFD_DISABLED)
                goto out;
 
-       if (!ctx->eventfd_async || io_wq_current_is_worker())
+       if (!ev_fd->eventfd_async || io_wq_current_is_worker())
                eventfd_signal(ev_fd->cq_ev_fd, 1);
 
 out:
        return done ? done : err;
 }
 
-static int io_eventfd_register(struct io_ring_ctx *ctx, void __user *arg)
+static int io_eventfd_register(struct io_ring_ctx *ctx, void __user *arg,
+                              unsigned int eventfd_async)
 {
        struct io_ev_fd *ev_fd;
        __s32 __user *fds = arg;
                kfree(ev_fd);
                return ret;
        }
+       ev_fd->eventfd_async = eventfd_async;
 
        rcu_assign_pointer(ctx->io_ev_fd, ev_fd);
        return ret;
        case IORING_UNREGISTER_FILES:
        case IORING_REGISTER_FILES_UPDATE:
        case IORING_REGISTER_EVENTFD:
+       case IORING_REGISTER_EVENTFD_ASYNC:
        case IORING_UNREGISTER_EVENTFD:
        case IORING_REGISTER_PROBE:
        case IORING_REGISTER_PERSONALITY:
                ret = io_register_files_update(ctx, arg, nr_args);
                break;
        case IORING_REGISTER_EVENTFD:
-       case IORING_REGISTER_EVENTFD_ASYNC:
                ret = -EINVAL;
                if (nr_args != 1)
                        break;
-               ret = io_eventfd_register(ctx, arg);
-               if (ret)
+               ret = io_eventfd_register(ctx, arg, 0);
+               break;
+       case IORING_REGISTER_EVENTFD_ASYNC:
+               ret = -EINVAL;
+               if (nr_args != 1)
                        break;
-               if (opcode == IORING_REGISTER_EVENTFD_ASYNC)
-                       ctx->eventfd_async = 1;
-               else
-                       ctx->eventfd_async = 0;
+               ret = io_eventfd_register(ctx, arg, 1);
                break;
        case IORING_UNREGISTER_EVENTFD:
                ret = -EINVAL;