diff options
Diffstat (limited to 'main/nfs-utils/idmapd-dnotify-to-inotify.patch')
-rw-r--r-- | main/nfs-utils/idmapd-dnotify-to-inotify.patch | 105 |
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(); |