tevent: call epoll_panic() if EPOLL_CTL_DEL failed
authorStefan Metzmacher <metze@samba.org>
Fri, 15 Feb 2013 09:31:36 +0000 (10:31 +0100)
committerStefan Metzmacher <metze@samba.org>
Fri, 1 Mar 2013 17:51:54 +0000 (18:51 +0100)
Only ENOENT is ignored as it is no error.

Signed-off-by: Stefan Metzmacher <metze@samba.org>
lib/tevent/tevent_epoll.c

index a662fee3a651d0b4c7d4a9b79ef35ab1138eabb1..c2b31143fd9d2ab0ec430e099c2a549b925b65ec 100644 (file)
@@ -307,10 +307,17 @@ static void epoll_del_event(struct epoll_event_context *epoll_ev, struct tevent_
        event.events = epoll_map_flags(fde->flags);
        event.data.ptr = fde;
        ret = epoll_ctl(epoll_ev->epoll_fd, EPOLL_CTL_DEL, fde->fd, &event);
-       if (ret != 0) {
-               tevent_debug(epoll_ev->ev, TEVENT_DEBUG_FATAL,
-                            "epoll_del_event failed! probable early close bug (%s)\n",
-                            strerror(errno));
+       if (ret != 0 && errno == ENOENT) {
+               /*
+                * This can happen after a epoll_check_reopen
+                * within epoll_event_fd_destructor.
+                */
+               tevent_debug(epoll_ev->ev, TEVENT_DEBUG_TRACE,
+                            "EPOLL_CTL_DEL ignoring ENOENT for fd[%d]\n",
+                            fde->fd);
+       } else if (ret != 0) {
+               epoll_panic(epoll_ev, "EPOLL_CTL_DEL failed", false);
+               return;
        }
        fde->additional_flags &= ~EPOLL_ADDITIONAL_FD_FLAG_HAS_EVENT;
 }