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