int gasket_interrupt_set_eventfd(struct gasket_interrupt_data *interrupt_data,
                                 int interrupt, int event_fd)
 {
-       struct eventfd_ctx *ctx = eventfd_ctx_fdget(event_fd);
-
-       if (IS_ERR(ctx))
-               return PTR_ERR(ctx);
+       struct eventfd_ctx *ctx;
 
        if (interrupt < 0 || interrupt >= interrupt_data->num_interrupts)
                return -EINVAL;
 
+       ctx = eventfd_ctx_fdget(event_fd);
+
+       if (IS_ERR(ctx))
+               return PTR_ERR(ctx);
+
        interrupt_data->eventfd_ctxs[interrupt] = ctx;
        return 0;
 }
        if (interrupt < 0 || interrupt >= interrupt_data->num_interrupts)
                return -EINVAL;
 
-       interrupt_data->eventfd_ctxs[interrupt] = NULL;
+       if (interrupt_data->eventfd_ctxs[interrupt]) {
+               eventfd_ctx_put(interrupt_data->eventfd_ctxs[interrupt]);
+               interrupt_data->eventfd_ctxs[interrupt] = NULL;
+       }
        return 0;
 }