dovecot-2.2: Removed support for dnotify.
dovecot at dovecot.org
dovecot at dovecot.org
Wed Aug 19 11:48:41 UTC 2015
details: http://hg.dovecot.org/dovecot-2.2/rev/39255150d521
changeset: 18980:39255150d521
user: Timo Sirainen <tss at iki.fi>
date: Wed Aug 19 14:47:51 2015 +0300
description:
Removed support for dnotify.
Everybody should be using inotify by now.
diffstat:
configure.ac | 30 +----
doc/example-config/conf.d/10-mail.conf | 2 +-
src/lib/Makefile.am | 1 -
src/lib/ioloop-notify-dn.c | 220 ---------------------------------
src/lib/ioloop-notify-fd.c | 2 +-
src/master/main.c | 3 -
6 files changed, 3 insertions(+), 255 deletions(-)
diffs (truncated from 319 to 300 lines):
diff -r 06351f47a15c -r 39255150d521 configure.ac
--- a/configure.ac Wed Aug 19 14:33:09 2015 +0300
+++ b/configure.ac Wed Aug 19 14:47:51 2015 +0300
@@ -64,7 +64,7 @@
ioloop=best)
AC_ARG_WITH(notify,
-AS_HELP_STRING([--with-notify=NOTIFY], [Specify the file system notification method to use (inotify, kqueue, dnotify, none; default is detected in the above order)]),
+AS_HELP_STRING([--with-notify=NOTIFY], [Specify the file system notification method to use (inotify, kqueue, none; default is detected in the above order)]),
notify=$withval,
notify=)
@@ -602,34 +602,6 @@
fi
fi
-if test "$notify" = "" || test "$notify" = "dnotify"; then
- dnl * dnotify?
- AC_CACHE_CHECK([whether we can use dnotify],i_cv_have_dnotify,[
- AC_TRY_COMPILE([
- #define _GNU_SOURCE
- #include <fcntl.h>
- #include <signal.h>
- #include <unistd.h>
- ], [
- fcntl(0, F_SETSIG, SIGRTMIN);
- fcntl(0, F_NOTIFY, DN_CREATE | DN_DELETE | DN_RENAME | DN_MULTISHOT);
- ], [
- i_cv_have_dnotify=yes
- ], [
- i_cv_have_dnotify=no
- ])
- ])
- if test $i_cv_have_dnotify = yes; then
- AC_DEFINE(IOLOOP_NOTIFY_DNOTIFY,, [Use Linux dnotify])
- have_notify=dnotify
- notify=dnotify
- else
- if test "$notify" = "dnotify"; then
- AC_MSG_ERROR([dnotify requested but not available])
- fi
- fi
-fi
-
if test "$have_notify" = "none"; then
AC_DEFINE(IOLOOP_NOTIFY_NONE,, [No special notify support])
fi
diff -r 06351f47a15c -r 39255150d521 doc/example-config/conf.d/10-mail.conf
--- a/doc/example-config/conf.d/10-mail.conf Wed Aug 19 14:33:09 2015 +0300
+++ b/doc/example-config/conf.d/10-mail.conf Wed Aug 19 14:47:51 2015 +0300
@@ -215,7 +215,7 @@
# When IDLE command is running, mailbox is checked once in a while to see if
# there are any new mails or other changes. This setting defines the minimum
-# time to wait between those checks. Dovecot can also use dnotify, inotify and
+# time to wait between those checks. Dovecot can also use inotify and
# kqueue to find out immediately when changes occur.
#mailbox_idle_check_interval = 30 secs
diff -r 06351f47a15c -r 39255150d521 src/lib/Makefile.am
--- a/src/lib/Makefile.am Wed Aug 19 14:33:09 2015 +0300
+++ b/src/lib/Makefile.am Wed Aug 19 14:47:51 2015 +0300
@@ -81,7 +81,6 @@
ioloop-iolist.c \
ioloop-notify-none.c \
ioloop-notify-fd.c \
- ioloop-notify-dn.c \
ioloop-notify-inotify.c \
ioloop-notify-kqueue.c \
ioloop-poll.c \
diff -r 06351f47a15c -r 39255150d521 src/lib/ioloop-notify-dn.c
--- a/src/lib/ioloop-notify-dn.c Wed Aug 19 14:33:09 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,220 +0,0 @@
-/* Copyright (c) 2003-2015 Dovecot authors, see the included COPYING file */
-
-/* Logic is pretty much based on dnotify by Oskar Liljeblad. */
-
-#define _GNU_SOURCE
-#include "lib.h"
-
-#ifdef IOLOOP_NOTIFY_DNOTIFY
-
-#include "ioloop-private.h"
-#include "ioloop-notify-fd.h"
-#include "fd-set-nonblock.h"
-#include "fd-close-on-exec.h"
-
-#include <signal.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-struct ioloop_notify_handler_context {
- struct ioloop_notify_fd_context fd_ctx;
-
- struct io *event_io;
- int event_pipe[2];
-
- bool disabled;
-};
-
-static int sigrt_refcount = 0;
-
-static struct ioloop_notify_handler_context *io_loop_notify_handler_init(void);
-
-static void ioloop_dnotify_disable(struct ioloop_notify_handler_context *ctx)
-{
- if (ctx->disabled)
- return;
-
- if (--sigrt_refcount == 0)
- signal(SIGRTMIN, SIG_IGN);
-
- if (close(ctx->event_pipe[0]) < 0)
- i_error("close(dnotify pipe[0]) failed: %m");
- if (close(ctx->event_pipe[1]) < 0)
- i_error("close(dnotify pipe[1]) failed: %m");
- ctx->disabled = TRUE;
-}
-
-static void sigrt_handler(int signo ATTR_UNUSED, siginfo_t *si,
- void *data ATTR_UNUSED)
-{
- struct ioloop_notify_handler_context *ctx =
- current_ioloop->notify_handler_context;
- int saved_errno = errno;
- int ret;
-
- if (ctx->disabled)
- return;
-
- ret = write(ctx->event_pipe[1], &si->si_fd, sizeof(int));
- if (ret < 0 && errno != EINTR && errno != EAGAIN) {
- i_error("write(dnotify pipe) failed: %m");
- ioloop_dnotify_disable(ctx);
- }
-
- i_assert(ret <= 0 || ret == sizeof(int));
-
- errno = saved_errno;
-}
-
-static void dnotify_input(struct ioloop *ioloop)
-{
- struct ioloop_notify_handler_context *ctx =
- ioloop->notify_handler_context;
- struct io_notify *io;
- int fd_buf[256], i, ret;
-
- ret = read(ctx->event_pipe[0], fd_buf, sizeof(fd_buf));
- if (ret < 0)
- i_fatal("read(dnotify pipe) failed: %m");
- if ((ret % sizeof(fd_buf[0])) != 0)
- i_fatal("read(dnotify pipe) returned %d", ret);
- ret /= sizeof(fd_buf[0]);
-
- if (gettimeofday(&ioloop_timeval, NULL) < 0)
- i_fatal("gettimeofday(): %m");
- ioloop_time = ioloop_timeval.tv_sec;
-
- for (i = 0; i < ret; i++) {
- io = io_notify_fd_find(&ctx->fd_ctx, fd_buf[i]);
- if (io != NULL)
- io_loop_call_io(&io->io);
- }
-}
-
-#undef io_add_notify
-enum io_notify_result io_add_notify(const char *path, io_callback_t *callback,
- void *context, struct io **io_r)
-{
- struct ioloop_notify_handler_context *ctx =
- current_ioloop->notify_handler_context;
- int fd;
-
- *io_r = NULL;
-
- if (ctx == NULL)
- ctx = io_loop_notify_handler_init();
- if (ctx->disabled)
- return IO_NOTIFY_NOSUPPORT;
-
- fd = open(path, O_RDONLY);
- if (fd == -1) {
- /* ESTALE could happen with NFS. Don't bother giving an error
- message then. */
- if (errno != ENOENT && errno != ESTALE)
- i_error("open(%s) for dnotify failed: %m", path);
- return IO_NOTIFY_NOTFOUND;
- }
-
- if (fcntl(fd, F_SETSIG, SIGRTMIN) < 0) {
- /* EINVAL means there's no realtime signals and no dnotify */
- if (errno != EINVAL)
- i_error("fcntl(F_SETSIG) failed: %m");
- ioloop_dnotify_disable(ctx);
- i_close_fd(&fd);
- return IO_NOTIFY_NOSUPPORT;
- }
- if (fcntl(fd, F_NOTIFY, DN_CREATE | DN_DELETE | DN_RENAME |
- DN_MULTISHOT) < 0) {
- if (errno == ENOTDIR) {
- /* we're trying to add dnotify to a non-directory fd.
- fail silently. */
- } else {
- /* dnotify not in kernel. disable it. */
- if (errno != EINVAL)
- i_error("fcntl(F_NOTIFY) failed: %m");
- ioloop_dnotify_disable(ctx);
- }
- (void)fcntl(fd, F_SETSIG, 0);
- i_close_fd(&fd);
- return IO_NOTIFY_NOSUPPORT;
- }
-
- if (ctx->event_io == NULL) {
- ctx->event_io = io_add(ctx->event_pipe[0], IO_READ,
- dnotify_input, current_ioloop);
- }
-
- *io_r = io_notify_fd_add(&ctx->fd_ctx, fd, callback, context);
- return IO_NOTIFY_ADDED;
-}
-
-void io_loop_notify_remove(struct io *_io)
-{
- struct ioloop_notify_handler_context *ctx =
- _io->ioloop->notify_handler_context;
- struct io_notify *io = (struct io_notify *)_io;
-
- if (fcntl(io->fd, F_NOTIFY, 0) < 0)
- i_error("fcntl(F_NOTIFY, 0) failed: %m");
- if (fcntl(io->fd, F_SETSIG, 0) < 0)
- i_error("fcntl(F_SETSIG, 0) failed: %m");
- if (close(io->fd))
- i_error("close(dnotify) failed: %m");
-
- io_notify_fd_free(&ctx->fd_ctx, io);
-
- if (ctx->fd_ctx.notifies == NULL)
- io_remove(&ctx->event_io);
-}
-
-static struct ioloop_notify_handler_context *io_loop_notify_handler_init(void)
-{
- struct ioloop_notify_handler_context *ctx;
- struct sigaction act;
-
- ctx = current_ioloop->notify_handler_context =
- i_new(struct ioloop_notify_handler_context, 1);
-
- if (pipe(ctx->event_pipe) < 0) {
- ctx->disabled = TRUE;
- i_error("dnotify: pipe() failed: %m");
- return ctx;
- }
-
- fd_set_nonblock(ctx->event_pipe[0], TRUE);
- fd_set_nonblock(ctx->event_pipe[1], TRUE);
-
- fd_close_on_exec(ctx->event_pipe[0], TRUE);
- fd_close_on_exec(ctx->event_pipe[1], TRUE);
-
- if (sigrt_refcount++ == 0) {
- /* SIGIO is sent if queue gets full. we'll just ignore it. */
- signal(SIGIO, SIG_IGN);
-
- act.sa_sigaction = sigrt_handler;
- sigemptyset(&act.sa_mask);
- act.sa_flags = SA_SIGINFO | SA_RESTART | SA_NODEFER;
-
- if (sigaction(SIGRTMIN, &act, NULL) < 0) {
- if (errno == EINVAL) {
- /* kernel is too old to understand even RT
- signals, so there's no way dnotify works */
- ioloop_dnotify_disable(ctx);
- } else {
- i_fatal("sigaction(SIGRTMIN) failed: %m");
- }
- }
- }
- return ctx;
-}
-
-void io_loop_notify_handler_deinit(struct ioloop *ioloop)
-{
- struct ioloop_notify_handler_context *ctx =
- ioloop->notify_handler_context;
-
- ioloop_dnotify_disable(ctx);
- i_free(ctx);
-}
-
-#endif
diff -r 06351f47a15c -r 39255150d521 src/lib/ioloop-notify-fd.c
--- a/src/lib/ioloop-notify-fd.c Wed Aug 19 14:33:09 2015 +0300
+++ b/src/lib/ioloop-notify-fd.c Wed Aug 19 14:47:51 2015 +0300
@@ -4,7 +4,7 @@
#include "ioloop-private.h"
#include "ioloop-notify-fd.h"
More information about the dovecot-cvs
mailing list