From patchwork Wed Jun 21 21:23:38 2017
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: [V2] idmapd: Use inotify instead of dnotify
From: Alan Swanson <reiver@improbability.net>
X-Patchwork-Id: 9802949
Message-Id: <20170621212338.32460-1-reiver@improbability.net>
To: linux-nfs@vger.kernel.org
Cc: Alan Swanson <reiver@improbability.net>
Date: Wed, 21 Jun 2017 22:23:38 +0100

Remove last use of dnotify in nfs-utils by bringing idmapd upto
date with (required) inotify use by gssd and blkmapd.
---
 utils/idmapd/idmapd.c | 32 +++++++++++++++++---------------
 1 file changed, 17 insertions(+), 15 deletions(-)

Got annoyed by the dnotify kernel requirement. Read the last
discussion "DNOTIFY to INOTIFY migration" posted in 2014 and while
still not officially depreciated, dnotify was officially "replaced"
by inotify in Linux 2.6.13 in 2005. Would be nice to sync this
requirement across the codebase.

V2: Init wd to -1 not 0

diff --git a/utils/idmapd/idmapd.c b/utils/idmapd/idmapd.c
index c12e878..c29dba6 100644
--- a/utils/idmapd/idmapd.c
+++ b/utils/idmapd/idmapd.c
@@ -36,7 +36,7 @@
 
 #include <sys/types.h>
 #include <sys/time.h>
-#include <sys/poll.h>
+#include <sys/inotify.h>
 #include <sys/socket.h>
 #include <sys/stat.h>
 #include <time.h>
@@ -205,15 +205,16 @@ void usage(char *progname)
 int
 main(int argc, char **argv)
 {
-	int fd = 0, opt, fg = 0, nfsdret = -1;
+	int wd = -1, opt, fg = 0, nfsdret = -1;
 	struct idmap_clientq icq;
-	struct event rootdirev, clntdirev, svrdirev;
+	struct event rootdirev, clntdirev, svrdirev, inotifyev;
 	struct event initialize;
 	struct passwd *pw;
 	struct group *gr;
 	struct stat sb;
 	char *xpipefsdir = NULL;
 	int serverstart = 1, clientstart = 1;
+	int inotify_fd;
 	int ret;
 	char *progname;
 	char *conf_path = NULL;
@@ -373,18 +374,15 @@ main(int argc, char **argv)
 			}
 		}
 
-		if ((fd = open(pipefsdir, O_RDONLY)) == -1)
-			xlog_err("main: open(%s): %s", pipefsdir, strerror(errno));
-
-		if (fcntl(fd, F_SETSIG, SIGUSR1) == -1)
-			xlog_err("main: fcntl(%s): %s", pipefsdir, strerror(errno));
-
-		if (fcntl(fd, F_NOTIFY,
-			DN_CREATE | DN_DELETE | DN_MODIFY | DN_MULTISHOT) == -1) {
-			xlog_err("main: fcntl(%s): %s", pipefsdir, strerror(errno));
-			if (errno == EINVAL)
-				xlog_err("main: Possibly no Dnotify support in kernel.");
+		inotify_fd = inotify_init1(IN_NONBLOCK);
+		if (inotify_fd == -1) {
+			xlog_err("Unable to initialise inotify_init1: %s\n", strerror(errno));
+		} else {
+			wd = inotify_add_watch(inotify_fd, pipefsdir, IN_CREATE | IN_DELETE | IN_MODIFY);
+			if (wd < 0)
+				xlog_err("Unable to inotify_add_watch(%s): %s\n", pipefsdir, strerror(errno));
 		}
+
 		TAILQ_INIT(&icq);
 
 		/* These events are persistent */
@@ -394,6 +392,10 @@ main(int argc, char **argv)
 		signal_add(&clntdirev, NULL);
 		signal_set(&svrdirev, SIGHUP, svrreopen, NULL);
 		signal_add(&svrdirev, NULL);
+		if ( wd >= 0) {
+			event_set(&inotifyev, inotify_fd, EV_READ | EV_PERSIST, dirscancb, &icq);
+			event_add(&inotifyev, NULL);
+		}
 
 		/* Fetch current state */
 		/* (Delay till start of event_dispatch to avoid possibly losing
@@ -402,7 +404,7 @@ main(int argc, char **argv)
 		evtimer_add(&initialize, &now);
 	}
 
-	if (nfsdret != 0 && fd == 0)
+	if (nfsdret != 0 && wd < 0)
 		xlog_err("main: Neither NFS client nor NFSd found");
 
 	daemon_ready();
