- rc = epoll_ctl(epollfd(fdev_epoll), EPOLL_CTL_MOD, fd, &event);
- if (rc < 0 && errno == ENOENT)
- epoll_ctl(epollfd(fdev_epoll), EPOLL_CTL_ADD, fd, &event);
+ rc = epoll_ctl(epollfd(fdev_epoll), op, fd, &event);
+ if (rc < 0 && errno == err)
+ epoll_ctl(epollfd(fdev_epoll), (EPOLL_CTL_MOD + EPOLL_CTL_ADD) - op, fd, &event);
+}
+
+/*
+ * enable callback for fdev
+ *
+ * refs to fdev must not be counted here
+ */
+static void enable(void *closure, const struct fdev *fdev)
+{
+ enable_or_update(closure, fdev, EPOLL_CTL_ADD, EEXIST);
+}
+
+/*
+ * update callback for fdev
+ *
+ * refs to fdev must not be counted here
+ */
+static void update(void *closure, const struct fdev *fdev)
+{
+ enable_or_update(closure, fdev, EPOLL_CTL_MOD, ENOENT);