aboutsummaryrefslogtreecommitdiffstats
path: root/main/nfs-utils/idmapd-dnotify-to-inotify.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/nfs-utils/idmapd-dnotify-to-inotify.patch')
-rw-r--r--main/nfs-utils/idmapd-dnotify-to-inotify.patch105
1 files changed, 105 insertions, 0 deletions
diff --git a/main/nfs-utils/idmapd-dnotify-to-inotify.patch b/main/nfs-utils/idmapd-dnotify-to-inotify.patch
new file mode 100644
index 0000000000..d1a3011f7f
--- /dev/null
+++ b/main/nfs-utils/idmapd-dnotify-to-inotify.patch
@@ -0,0 +1,105 @@
+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();