diff -up nfs-utils-1.3.0/configure.ac.orig nfs-utils-1.3.0/configure.ac
--- nfs-utils-1.3.0/configure.ac.orig 2017-03-28 13:43:36.000000000 -0400
+++ nfs-utils-1.3.0/configure.ac 2017-03-28 13:43:53.000000000 -0400
@@ -23,6 +23,12 @@ AC_ARG_WITH(statedir,
statedir=$withval,
statedir=/var/lib/nfs)
AC_SUBST(statedir)
+AC_ARG_WITH(nfsconfig,
+ [AC_HELP_STRING([--with-nfsconfig=/config/file],
+ [use general config file /config/file @<:@default=/etc/nfs.conf@:>@])],
+ nfsconfig=$withval,
+ nfsconfig=/etc/nfs.conf)
+ AC_SUBST(nfsconfig)
AC_ARG_WITH(statdpath,
[AC_HELP_STRING([--with-statdpath=/foo],
[define the statd state dir as /foo instead of the NFS statedir @<:@default=/var/lib/nfs@:>@])],
@@ -442,6 +448,7 @@ dnl Export some path names to config.h
dnl *************************************************************
AC_DEFINE_UNQUOTED(NFS_STATEDIR, "$statedir", [This defines the location of the NFS state files. Warning: this must match definitions in config.mk!])
AC_DEFINE_UNQUOTED(NSM_DEFAULT_STATEDIR, "$statdpath", [Define this to the pathname where statd keeps its state file])
+AC_DEFINE_UNQUOTED(NFS_CONFFILE, "$nfsconfig", [This defines the location of NFS daemon config file])
if test "x$cross_compiling" = "xno"; then
CFLAGS_FOR_BUILD=${CFLAGS_FOR_BUILD-"$CFLAGS"}
diff -up nfs-utils-1.3.0/support/include/conffile.h.orig nfs-utils-1.3.0/support/include/conffile.h
--- nfs-utils-1.3.0/support/include/conffile.h.orig 2014-03-25 11:12:07.000000000 -0400
+++ nfs-utils-1.3.0/support/include/conffile.h 2017-03-28 13:43:53.000000000 -0400
@@ -35,6 +35,8 @@
#include <sys/queue.h>
#include <ctype.h>
+#include <stdint.h>
+#include <stdbool.h>
struct conf_list_node {
TAILQ_ENTRY(conf_list_node) link;
@@ -56,6 +58,7 @@ extern struct sockaddr *conf_get_address
extern struct conf_list *conf_get_list(char *, char *);
extern struct conf_list *conf_get_tag_list(char *, char *);
extern int conf_get_num(char *, char *, int);
+extern _Bool conf_get_bool(char *, char *, _Bool);
extern char *conf_get_str(char *, char *);
extern char *conf_get_section(char *, char *, char *);
extern void conf_init(void);
diff -up nfs-utils-1.3.0/support/include/xlog.h.orig nfs-utils-1.3.0/support/include/xlog.h
--- nfs-utils-1.3.0/support/include/xlog.h.orig 2014-03-25 11:12:07.000000000 -0400
+++ nfs-utils-1.3.0/support/include/xlog.h 2017-03-28 13:43:53.000000000 -0400
@@ -41,6 +41,7 @@ void xlog_stderr(int on);
void xlog_syslog(int on);
void xlog_config(int fac, int on);
void xlog_sconfig(char *, int on);
+void xlog_from_conffile(char *);
int xlog_enabled(int fac);
void xlog(int fac, const char *fmt, ...);
void xlog_warn(const char *fmt, ...);
diff -up nfs-utils-1.3.0/support/nfs/conffile.c.orig nfs-utils-1.3.0/support/nfs/conffile.c
--- nfs-utils-1.3.0/support/nfs/conffile.c.orig 2014-03-25 11:12:07.000000000 -0400
+++ nfs-utils-1.3.0/support/nfs/conffile.c 2017-03-28 13:43:53.000000000 -0400
@@ -52,6 +52,7 @@
#pragma GCC visibility push(hidden)
static void conf_load_defaults(void);
+static int conf_load(int trans, char *path);
static int conf_set(int , char *, char *, char *,
char *, int , int );
@@ -107,8 +108,6 @@ struct conf_binding {
char *conf_path;
LIST_HEAD (conf_bindings, conf_binding) conf_bindings[256];
-static char *conf_addr;
-
static __inline__ u_int8_t
conf_hash(char *s)
{
@@ -213,7 +212,7 @@ static void
conf_parse_line(int trans, char *line, size_t sz)
{
char *val, *ptr;
- size_t i, valsize;
+ size_t i;
size_t j;
static char *section = 0;
static char *arg = 0;
@@ -300,18 +299,32 @@ conf_parse_line(int trans, char *line, s
}
line[strcspn (line, " \t=")] = '\0';
val = line + i + 1 + strspn (line + i + 1, " \t");
- valsize = 0;
- while (val[valsize++]);
- /* Skip trailing spaces and comments */
- for (j = 0; j < valsize; j++) {
- if (val[j] == '#' || val[j] == ';' || isspace(val[j])) {
- val[j] = '\0';
- break;
+ if (val[0] == '"') {
+ val ++;
+ j = strcspn(val, "\"");
+ val[j] = 0;
+ } else if (val[0] == '\'') {
+ val ++;
+ j = strcspn(val, "'");
+ val[j] = 0;
+ } else {
+ /* Skip trailing spaces and comments */
+ for (j = 0; val[j]; j++) {
+ if ((val[j] == '#' || val[j] == ';')
+ && (j == 0 || isspace(val[j-1]))) {
+ val[j] = '\0';
+ break;
+ }
}
+ while (j && isspace(val[j-1]))
+ val[--j] = '\0';
}
- /* XXX Perhaps should we not ignore errors? */
- conf_set(trans, section, arg, line, val, 0, 0);
+ if (strcasecmp(line, "include") == 0)
+ conf_load(trans, val);
+ else
+ /* XXX Perhaps should we not ignore errors? */
+ conf_set(trans, section, arg, line, val, 0, 0);
return;
}
}
@@ -368,23 +381,18 @@ conf_init (void)
conf_reinit();
}
-/* Open the config file and map it into our address space, then parse it. */
-void
-conf_reinit(void)
+static int
+conf_load(int trans, char *path)
{
- struct conf_binding *cb = 0;
- int fd, trans;
- unsigned int i;
- size_t sz;
- char *new_conf_addr = 0;
struct stat sb;
+ if ((stat (path, &sb) == 0) || (errno != ENOENT)) {
+ char *new_conf_addr;
+ size_t sz = sb.st_size;
+ int fd = open (path, O_RDONLY, 0);
- if ((stat (conf_path, &sb) == 0) || (errno != ENOENT)) {
- sz = sb.st_size;
- fd = open (conf_path, O_RDONLY, 0);
if (fd == -1) {
- xlog_warn("conf_reinit: open (\"%s\", O_RDONLY) failed", conf_path);
- return;
+ xlog_warn("conf_reinit: open (\"%s\", O_RDONLY) failed", path);
+ return -1;
}
new_conf_addr = malloc(sz);
@@ -396,39 +404,46 @@ conf_reinit(void)
/* XXX I assume short reads won't happen here. */
if (read (fd, new_conf_addr, sz) != (int)sz) {
xlog_warn("conf_reinit: read (%d, %p, %lu) failed",
- fd, new_conf_addr, (unsigned long)sz);
+ fd, new_conf_addr, (unsigned long)sz);
goto fail;
}
close(fd);
- trans = conf_begin();
/* XXX Should we not care about errors and rollback? */
conf_parse(trans, new_conf_addr, sz);
+ free(new_conf_addr);
+ return 0;
+ fail:
+ close(fd);
+ free(new_conf_addr);
}
- else
- trans = conf_begin();
+ return -1;
+}
+
+/* Open the config file and map it into our address space, then parse it. */
+void
+conf_reinit(void)
+{
+ struct conf_binding *cb = 0;
+ int trans;
+ unsigned int i;
+
+ trans = conf_begin();
+ if (conf_load(trans, conf_path) < 0)
+ return;
/* Load default configuration values. */
conf_load_defaults();
/* Free potential existing configuration. */
- if (conf_addr) {
- for (i = 0; i < sizeof conf_bindings / sizeof conf_bindings[0]; i++) {
- cb = LIST_FIRST (&conf_bindings[i]);
- for (; cb; cb = LIST_FIRST (&conf_bindings[i]))
- conf_remove_now(cb->section, cb->tag);
- }
- free (conf_addr);
+ for (i = 0; i < sizeof conf_bindings / sizeof conf_bindings[0]; i++) {
+ cb = LIST_FIRST (&conf_bindings[i]);
+ for (; cb; cb = LIST_FIRST (&conf_bindings[i]))
+ conf_remove_now(cb->section, cb->tag);
}
conf_end(trans, 1);
- conf_addr = new_conf_addr;
return;
-
-fail:
- if (new_conf_addr)
- free(new_conf_addr);
- close (fd);
}
/*
@@ -446,6 +461,38 @@ conf_get_num(char *section, char *tag, i
return def;
}
+/*
+ * Return the Boolean value denoted by TAG in section SECTION, or DEF
+ * if that tags does not exist.
+ * FALSE is returned for case-insensitve comparisons with 0, f, false, n, no, off
+ * TRUE is returned for 1, t, true, y, yes, on
+ * A failure to match one of these results in DEF
+ */
+_Bool
+conf_get_bool(char *section, char *tag, _Bool def)
+{
+ char *value = conf_get_str(section, tag);
+
+ if (!value)
+ return def;
+ if (strcasecmp(value, "1") == 0 ||
+ strcasecmp(value, "t") == 0 ||
+ strcasecmp(value, "true") == 0 ||
+ strcasecmp(value, "y") == 0 ||
+ strcasecmp(value, "yes") == 0 ||
+ strcasecmp(value, "on") == 0)
+ return true;
+
+ if (strcasecmp(value, "0") == 0 ||
+ strcasecmp(value, "f") == 0 ||
+ strcasecmp(value, "false") == 0 ||
+ strcasecmp(value, "n") == 0 ||
+ strcasecmp(value, "no") == 0 ||
+ strcasecmp(value, "off") == 0)
+ return false;
+ return def;
+}
+
/* Validate X according to the range denoted by TAG in section SECTION. */
int
conf_match_num(char *section, char *tag, int x)
@@ -476,12 +523,24 @@ char *
conf_get_str(char *section, char *tag)
{
struct conf_binding *cb;
-
+retry:
cb = LIST_FIRST (&conf_bindings[conf_hash (section)]);
for (; cb; cb = LIST_NEXT (cb, link)) {
if (strcasecmp (section, cb->section) == 0
- && strcasecmp (tag, cb->tag) == 0)
+ && strcasecmp (tag, cb->tag) == 0) {
+ if (cb->value[0] == '$') {
+ /* expand $name from [environment] section,
+ * or from environment
+ */
+ char *env = getenv(cb->value+1);
+ if (env && *env)
+ return env;
+ section = "environment";
+ tag = cb->value + 1;
+ goto retry;
+ }
return cb->value;
+ }
}
return 0;
}
@@ -705,6 +764,8 @@ conf_set(int transaction, char *section,
{
struct conf_trans *node;
+ if (!value || !*value)
+ return 0;
node = conf_trans_node(transaction, CONF_SET);
if (!node)
return 1;
diff -up nfs-utils-1.3.0/support/nfs/xlog.c.orig nfs-utils-1.3.0/support/nfs/xlog.c
--- nfs-utils-1.3.0/support/nfs/xlog.c.orig 2014-03-25 11:12:07.000000000 -0400
+++ nfs-utils-1.3.0/support/nfs/xlog.c 2017-03-28 13:43:53.000000000 -0400
@@ -29,6 +29,7 @@
#include <syslog.h>
#include <errno.h>
#include "nfslib.h"
+#include "conffile.h"
#undef VERBOSE_PRINTF
@@ -125,6 +126,19 @@ xlog_sconfig(char *kind, int on)
xlog_config(tbl->df_fac, on);
}
+void
+xlog_from_conffile(char *service)
+{
+ struct conf_list *kinds;
+ struct conf_list_node *n;
+
+ kinds = conf_get_list(service, "debug");
+ if (!kinds || !kinds->cnt)
+ return;
+ TAILQ_FOREACH(n, &(kinds->fields), link)
+ xlog_sconfig(n->field, 1);
+}
+
int
xlog_enabled(int fac)
{
diff -up nfs-utils-1.3.0/systemd/Makefile.am.orig nfs-utils-1.3.0/systemd/Makefile.am
--- nfs-utils-1.3.0/systemd/Makefile.am.orig 2017-03-28 13:43:36.000000000 -0400
+++ nfs-utils-1.3.0/systemd/Makefile.am 2017-03-28 13:43:53.000000000 -0400
@@ -20,7 +20,9 @@ unit_files = \
proc-fs-nfsd.mount \
var-lib-nfs-rpc_pipefs.mount
-EXTRA_DIST = $(unit_files)
+man5_MANS = nfs.conf.man
+man7_MANS = nfs.systemd.man
+EXTRA_DIST = $(unit_files) $(man5_MANS) $(man7_MANS)
unit_dir = /usr/lib/systemd/system
diff -up nfs-utils-1.3.0/systemd/nfs.conf.man.orig nfs-utils-1.3.0/systemd/nfs.conf.man
--- nfs-utils-1.3.0/systemd/nfs.conf.man.orig 2017-03-28 13:43:53.000000000 -0400
+++ nfs-utils-1.3.0/systemd/nfs.conf.man 2017-03-28 13:43:53.000000000 -0400
@@ -0,0 +1,231 @@
+.TH NFS.CONF 5
+.SH NAME
+nfs.conf \- general configuration for NFS daemons and tools
+.SH SYNOPSIS
+.I /etc/nfs.conf
+.SH DESCRIPTION
+.PP
+This file contains site-specific configuration for various NFS daemons
+and other processes. Most configuration can also be passed to
+processes via command line arguments, but it can be more convenient to
+have a central file. In particular, this encourages consistent
+configuration across different processes.
+.PP
+When command line options are provided, they override values set in
+this file. When this file does not specify a particular parameter,
+and no command line option is provided, each tool provides its own
+default values.
+.PP
+The file format supports multiple sections, each of which can contain
+multiple value assignments. A section is introduced by a line
+containing the section name enclosed in square brackets, so
+.RS
+.B [global]
+.RE
+would introduce a section called
+.BR global .
+A value assignment is a single line that has the name of the value, an
+equals sign, and a setting for the value, so
+.RS
+.B threads = 4
+.RE
+would set the value named
+.B threads
+in the current section to
+.BR 4 .
+Leading and trailing spaces and tab
+are ignored, as are spaces and tabs surrounding the equals sign.
+Single and double quotes surrounding the assigned value are also
+removed. If the resulting string is empty, the whole assignment
+is ignored.
+.PP
+Any line starting with
+.RB \*(lq # \*(rq
+or
+.RB \*(lq ; \*(rq
+is ignored, as is any blank line.
+.PP
+If the assigned value started with a
+.RB \*(lq $ \*(rq
+then the remainder is treated as a name and looked for in the section
+.B [environment]
+or in the processes environment (see
+.BR environ (7)).
+The value found is used for this value.
+.PP
+The value name
+.B include
+is special. If a section contains
+.RS
+.B include = /some/file/name
+.RE
+then the named file will be read, and any value assignments found
+there-in will be added to the current section. If the file contains
+section headers, then new sections will be created just as if the
+included file appeared in place of the
+.B include
+line.
+.PP
+Lookup of section and value names is case-insensitive.
+
+Where a Boolean value is expected, any of
+.BR true ,
+.BR t ,
+.BR yes ,
+.BR y ,
+.BR on ", or"
+.B 1
+can be used for "true", while
+.BR false ,
+.BR f ,
+.BR no ,
+.BR n ,
+.BR off ", or"
+.B 0
+can be used for "false". Comparisons are case-insensitive.
+
+.SH SECTIONS
+The following sections are known to various programs, and can contain
+the given named values. Most sections can also contain a
+.B debug
+value, which can be one or more from the list
+.BR general ,
+.BR call ,
+.BR auth ,
+.BR parse ,
+.BR all .
+When a list is given, the members should be comma-separated.
+.TP
+.B nfsdcltrack
+Recognized values:
+.BR storagedir .
+
+The
+.B nfsdcltrack
+program is run directly by the Linux kernel and there is no
+opportunity to provide command line arguments, so the configuration
+file is the only way to configure this program. See
+.BR nfsdcltrack (8)
+for details.
+
+.TP
+.B nfsd
+Recognized values:
+.BR threads ,
+.BR host ,
+.BR port ,
+.BR grace-time ,
+.BR lease-time ,
+.BR udp ,
+.BR tcp ,
+.BR vers2 ,
+.BR vers3 ,
+.BR vers4 ,
+.BR vers4.0 ,
+.BR vers4.1 ,
+.BR vers4.2 ,
+.BR rdma .
+
+Version and protocol values are Boolean values as described above,
+and are also used by
+.BR rpc.mountd .
+Threads and the two times are integers.
+.B port
+and
+.B rdma
+are service names or numbers. See
+.BR rpc.nfsd (8)
+for details.
+
+.TP
+.B mountd
+Recognized values:
+.BR manage-gids ,
+.BR descriptors ,
+.BR port ,
+.BR threads ,
+.BR reverse-lookup ,
+.BR state-directory-path ,
+.BR ha-callout .
+
+These, together with the protocol and version values in the
+.B [nfsd]
+section, are used to configure mountd. See
+.BR rpc.mountd (8)
+for details.
+
+.TP
+.B statd
+Recognized values:
+.BR port ,
+.BR outgoing-port ,
+.BR name ,
+.BR state-directory-path ,
+.BR ha-callout .
+
+See
+.BR rpc.statd (8)
+for details.
+
+.TP
+.B lockd
+Recognized values:
+.B port
+and
+.BR udp-port .
+
+See
+.BR rpc.statd (8)
+for details.
+
+.TP
+.B sm-notify
+Recognized values:
+.BR retry-time ,
+.BR outgoing-port ", and"
+.BR outgoing-addr .
+
+See
+.BR sm-notify (8)
+for details.
+
+.TP
+.B gssd
+Recognized values:
+.BR use-memcache ,
+.BR use-machine-creds ,
+.BR avoid-dns ,
+.BR limit-to-legacy-enctypes ,
+.BR context-timeout ,
+.BR rpc-timeout ,
+.BR pipefs-directory ,
+.BR keytab-file ,
+.BR cred-cache-directory ,
+.BR preferred-realm .
+
+See
+.BR rpc.gssd (8)
+for details.
+
+.TP
+.B svcgssd
+Recognized values:
+.BR principal .
+
+See
+.BR rpc.svcgssd (8)
+for details.
+
+.TP
+.B exportfs
+Only
+.B debug=
+is recognized.
+
+.SH FILES
+.I /etc/nfs.conf
+.SH SEE ALSO
+.BR nfsdcltrack (8),
+.BR rpc.nfsd (8),
+.BR rpc.mountd (8),
+.BR nfsmount.conf (5).
diff -up nfs-utils-1.3.0/systemd/nfs.systemd.man.orig nfs-utils-1.3.0/systemd/nfs.systemd.man
--- nfs-utils-1.3.0/systemd/nfs.systemd.man.orig 2017-03-28 13:45:11.000000000 -0400
+++ nfs-utils-1.3.0/systemd/nfs.systemd.man 2017-03-28 13:45:11.000000000 -0400
@@ -0,0 +1,167 @@
+.TH NFS.SYSTEMD 7
+.SH NAME
+nfs.systemd \- managing NFS services through systemd.
+.SH SYNOPSIS
+nfs-utils.service
+.br
+nfs-server.service
+.br
+nfs-client.target
+.br
+.I etc
+.SH DESCRIPTION
+The
+.I nfs-utils
+package provides a suite of
+.I systemd
+unit files which allow the various services to be started and
+managed. These unit files ensure that the services are started in the
+correct order, and the prerequisites are active before dependant
+services start. As there are quite few unit files, it is not
+immediately obvious how best to achieve certain results. The
+following subsections attempt to cover the issues that are most likely
+to come up.
+.SS Configuration
+The standard systemd unit files do not provide any easy way to pass
+any command line arguments to daemons so as to configure their
+behavior. In many case such configuration can be performed by making
+changes to
+.I /etc/nfs.conf
+or other configuration files. When that is not convenient, a
+distribution might provide systemd "drop-in" files which replace the
+.B ExecStart=
+setting to start the program with different arguments. For example a
+drop-in file
+.B systemd/system/nfs-mountd.service.d/local.conf
+containing
+.RS
+.nf
+[Service]
+EnvironmentFile=/etc/sysconfig/nfs
+ExecStart=
+ExecStart= /usr/sbin/rpc.mountd $RPCMOUNTDOPTS
+.fi
+.RE
+would cause the
+.B nfs-mountd.service
+unit to run the
+.I rpc.mountd
+program using, for arguments, the value given for
+.B RPCMOUNTDOPTS
+in
+.IR /etc/sysconfig/nfs .
+This allows for seamless integration with existing configuration
+tools.
+.SS Enabling unit files
+There are three unit files which are designed to be manually enabled.
+All others are automatically run as required. The three are:
+.TP
+.B nfs-client.target
+This should be enabled on any host which ever serves as an NFS client.
+There is little cost in transparently enabling it whenever NFS client
+software is installed.
+.TP
+.B nfs-server.service
+This must be enabled to provide NFS service to clients. It starts and
+configures the required daemons in the required order.
+.TP
+.B nfs-blkmap.service
+The
+.B blkmapd
+daemon is only required on NFS clients which are using pNFS (parallel
+NFS), and particularly using the
+.B blocklayout
+layout protocol. If you might use this particular extension to NFS,
+the
+.B nfs-blkmap.service
+unit should be enabled.
+.PP
+Several other units which might be considered to be optional, such as
+.I rpc-gssd.service
+are careful to only start if the required configuration file exists.
+.I rpc-gsdd.service
+will not start if the
+.I krb5.keytab
+file does not exist (typically in
+.IR /etc ).
+.SS Restarting NFS services
+Most NFS daemons can be restarted at any time. They will reload any
+state that they need, and continue servicing requests. This is rarely
+necessary though.
+.PP
+When configuration changesare make, it can be hard to know exactly
+which services need to be restarted to ensure that the configuration
+takes effect. The simplest approach, which is often the best, is to
+restart everything. To help with this, the
+.B nfs-utils.service
+unit is provided. It declares appropriate dependencies with other
+unit files so that
+.RS
+.B systemctl restart nfs-utils
+.RE
+will restart all NFS daemons that are running. This will cause all
+configuration changes to take effect
+.I except
+for changes to mount options lists in
+.I /etc/fstab
+or
+.IR /etc/nfsmount.conf .
+Mount options can only be changed by unmounting and remounting
+filesystem. This can be a disruptive operation so it should only be
+done when the value justifies the cost. The command
+.RS
+.B umount -a -t nfs; mount -a -t nfs
+.RE
+should unmount and remount all NFS filesystems.
+.SS Masking unwanted services
+Rarely there may be a desire to prohibit some services from running
+even though there are normally part of a working NFS system. This may
+be needed to reduce system load to an absolute minimum, or to reduce
+attack surface by not running daemons that are not absolutely
+required.
+.PP
+Two particular services which this can apply to are
+.I rpcbind
+and
+.IR idmapd .
+.I rpcbind
+is not part of the
+.I nfs-utils
+package, but it used by several NFS services. However it is
+.B not
+needed when only NFSv4 is in use. If a site will never use NFSv3 (or
+NFSv2) and does not want
+.I rpcbind
+to be running, the correct approach is to run
+.RS
+.B systemctl mask rpcbind
+.RE
+This will disable
+.IR rpcbind ,
+and the various NFS services which depend on it (and are only needed
+for NFSv3) will refuse to start, without interfering with the
+operation of NFSv4 services. In particular,
+.I rpc.statd
+will not run when
+.I rpcbind
+is masked.
+.PP
+.I idmapd
+is only needed for NFSv4, and even then is not needed when the client
+and server agree to use user-ids rather than user-names to identify the
+owners of files. If
+.I idmapd
+is not needed and not wanted, it can be masked with
+.RS
+.B systemctl mask idmapd
+.RE
+.SH FILES
+/etc/nfs.conf
+.br
+/etc/nfsmount.conf
+.br
+/etc/idmapd.conf
+.SH SEE ALSO
+.BR systemd.unit (5),
+.BR nfs.conf (5),
+.BR nfsmount.conf (5).
diff -up nfs-utils-1.3.0/systemd/rpc-statd.service.orig nfs-utils-1.3.0/systemd/rpc-statd.service
--- nfs-utils-1.3.0/systemd/rpc-statd.service.orig 2017-03-28 13:43:36.000000000 -0400
+++ nfs-utils-1.3.0/systemd/rpc-statd.service 2017-03-28 13:43:53.000000000 -0400
@@ -11,7 +11,8 @@ Wants=nfs-config.service
After=nfs-config.service
[Service]
+Environment=RPC_STATD_NO_NOTIFY=1
EnvironmentFile=-/run/sysconfig/nfs-utils
Type=forking
PIDFile=/var/run/rpc.statd.pid
-ExecStart=/usr/sbin/rpc.statd --no-notify $STATDARGS
+ExecStart=/usr/sbin/rpc.statd $STATDARGS
diff -up nfs-utils-1.3.0/utils/exportfs/exportfs.c.orig nfs-utils-1.3.0/utils/exportfs/exportfs.c
--- nfs-utils-1.3.0/utils/exportfs/exportfs.c.orig 2017-03-28 13:43:36.000000000 -0400
+++ nfs-utils-1.3.0/utils/exportfs/exportfs.c 2017-03-28 13:43:53.000000000 -0400
@@ -37,6 +37,7 @@
#include "nfslib.h"
#include "exportfs.h"
#include "xlog.h"
+#include "conffile.h"
static void export_all(int verbose);
static void exportfs(char *arg, char *options, int verbose);
@@ -53,6 +54,7 @@ static void release_lockfile(void);
static const char *lockfile = EXP_LOCKFILE;
static int _lockfd = -1;
+char *conf_path = NFS_CONFFILE;
/*
* If we aren't careful, changes made by exportfs can be lost
@@ -108,6 +110,9 @@ main(int argc, char **argv)
xlog_stderr(1);
xlog_syslog(0);
+ conf_init();
+ xlog_from_conffile("exportfs");
+
while ((c = getopt(argc, argv, "ad:fhio:ruvs")) != EOF) {
switch(c) {
case 'a':
diff -up nfs-utils-1.3.0/utils/exportfs/exportfs.man.orig nfs-utils-1.3.0/utils/exportfs/exportfs.man
--- nfs-utils-1.3.0/utils/exportfs/exportfs.man.orig 2017-03-28 13:43:36.000000000 -0400
+++ nfs-utils-1.3.0/utils/exportfs/exportfs.man 2017-03-28 13:43:53.000000000 -0400
@@ -90,6 +90,13 @@ to be added to the kernel's export table
.TP
.B \-d kind " or " \-\-debug kind
Turn on debugging. Valid kinds are: all, auth, call, general and parse.
+Debugging can also be turned on by setting
+.B debug=
+in the
+.B [exportfs]
+section of
+.IR /etc/nfs.conf .
+
.TP
.B -a
Export or unexport all directories.
@@ -295,6 +302,7 @@ master table of exports
table of clients accessing server's exports
.SH SEE ALSO
.BR exports (5),
+.BR nfs.conf (5),
.BR rpc.mountd (8),
.BR netgroup (5)
.SH AUTHORS
diff -up nfs-utils-1.3.0/utils/gssd/gssd.c.orig nfs-utils-1.3.0/utils/gssd/gssd.c
--- nfs-utils-1.3.0/utils/gssd/gssd.c.orig 2017-03-28 13:43:36.000000000 -0400
+++ nfs-utils-1.3.0/utils/gssd/gssd.c 2017-03-28 13:43:53.000000000 -0400
@@ -71,6 +71,7 @@
#include "gss_util.h"
#include "krb5_util.h"
#include "nfslib.h"
+#include "conffile.h"
static char *pipefs_path = GSSD_PIPEFS_DIR;
static DIR *pipefs_dir;
@@ -78,6 +79,7 @@ static int pipefs_fd;
static int inotify_fd;
struct event inotify_ev;
+char *conf_path = NFS_CONFFILE;
char *keytabfile = GSSD_DEFAULT_KEYTAB_FILE;
char **ccachesearch;
int use_memcache = 0;
@@ -831,6 +833,33 @@ main(int argc, char *argv[])
char *progname;
char *ccachedir = NULL;
struct event sighup_ev;
+ char *s;
+
+ conf_init();
+ use_memcache = conf_get_bool("gssd", "use-memcache", use_memcache);
+ root_uses_machine_creds = conf_get_bool("gssd", "use-machine-creds",
+ root_uses_machine_creds);
+ avoid_dns = conf_get_bool("gssd", "avoid-dns", avoid_dns);
+#ifdef HAVE_SET_ALLOWABLE_ENCTYPES
+ limit_to_legacy_enctypes = conf_get_bool("gssd", "limit-to-legacy-enctypes",
+ limit_to_legacy_enctypes);
+#endif
+ context_timeout = conf_get_num("gssd", "context-timeout", context_timeout);
+ rpc_timeout = conf_get_num("gssd", "rpc-timeout", rpc_timeout);
+ s = conf_get_str("gssd", "pipefs-directory");
+ if (!s)
+ s = conf_get_str("general", "pipefs-directory");
+ if (s)
+ pipefs_path = s;
+ s = conf_get_str("gssd", "keytab-file");
+ if (s)
+ keytabfile = s;
+ s = conf_get_str("gssd", "cred-cache-directory");
+ if (s)
+ ccachedir = s;
+ s = conf_get_str("gssd", "preferred-realm");
+ if (s)
+ preferred_realm = s;
while ((opt = getopt(argc, argv, "DfvrlmnMp:k:d:t:T:R:")) != -1) {
switch (opt) {
diff -up nfs-utils-1.3.0/utils/gssd/gssd.man.orig nfs-utils-1.3.0/utils/gssd/gssd.man
--- nfs-utils-1.3.0/utils/gssd/gssd.man.orig 2017-03-28 13:43:36.000000000 -0400
+++ nfs-utils-1.3.0/utils/gssd/gssd.man 2017-03-28 13:43:53.000000000 -0400
@@ -297,6 +297,60 @@ The default timeout is set to 5 seconds.
If you get messages like "WARNING: can't create tcp rpc_clnt to server
%servername% for user with uid %uid%: RPC: Remote system error -
Connection timed out", you should consider an increase of this timeout.
+.SH CONFIGURATION FILE
+Many of the options that can be set on the command line can also be
+controlled through values set in the
+.B [gssd]
+section of the
+.I /etc/nfs.conf
+configuration file. Values recognized include:
+.TP
+.B use-memcache
+A Boolean flag equivalent to
+.BR -M .
+.TP
+.B use-machine-creds
+A Boolean flag. Setting to
+.B false
+is equivalent to giving the
+.B -n
+flag.
+.TP
+.B avoid-dns
+Setting to
+.B false
+is equivalent to providing the
+.B -D
+flag.
+.TP
+.B limit-to-legacy-enctypes
+Equivalent to
+.BR -l .
+.TP
+.B context-timeout
+Equivalent to
+.BR -T .
+.TP
+.B rpc-timeout
+Equivalent to
+.BR -t .
+.TP
+.B pipefs-directory
+Equivalent to
+.BR -p .
+.TP
+.B keytab-file
+Equivalent to
+.BR -k .
+.TP
+.BR cred-cache-directory
+Equivalent to
+.BR -d .
+.TP
+.B preferred-realm
+Equivalent to
+.BR -R .
+
.SH SEE ALSO
.BR rpc.svcgssd (8),
.BR kerberos (1),
diff -up nfs-utils-1.3.0/utils/gssd/svcgssd.c.orig nfs-utils-1.3.0/utils/gssd/svcgssd.c
--- nfs-utils-1.3.0/utils/gssd/svcgssd.c.orig 2017-03-28 13:43:36.000000000 -0400
+++ nfs-utils-1.3.0/utils/gssd/svcgssd.c 2017-03-28 13:43:53.000000000 -0400
@@ -61,6 +61,9 @@
#include "svcgssd.h"
#include "gss_util.h"
#include "err_util.h"
+#include "conffile.h"
+
+char *conf_path = NFS_CONFFILE;
void
sig_die(int signal)
@@ -98,6 +101,17 @@ main(int argc, char *argv[])
extern char *optarg;
char *progname;
char *principal = NULL;
+ char *s;
+
+ conf_init();
+
+ s = conf_get_str("svcgssd", "principal");
+ if (!s)
+ ;
+ else if (strcmp(s, "system")== 0)
+ get_creds = 0;
+ else
+ principal = s;
while ((opt = getopt(argc, argv, "fivrnp:")) != -1) {
switch (opt) {
diff -up nfs-utils-1.3.0/utils/gssd/svcgssd.man.orig nfs-utils-1.3.0/utils/gssd/svcgssd.man
--- nfs-utils-1.3.0/utils/gssd/svcgssd.man.orig 2014-03-25 11:12:07.000000000 -0400
+++ nfs-utils-1.3.0/utils/gssd/svcgssd.man 2017-03-28 13:43:53.000000000 -0400
@@ -45,6 +45,23 @@ Use the system default credentials
.RI (host/ FQDN @ REALM )
rather than the default
.RI nfs/ FQDN @ REALM .
+.SH CONFIGURATION FILE
+Some of the options that can be set on the command line can also be
+controlled through values set in the
+.B [svcgssd]
+section of the
+.I /etc/nfs.conf
+configuration file. Values recognized include:
+.TP
+.B principal
+If set to
+.B system
+this is equivalent to the
+.B -n
+option. If set to any other value, that is used like the
+.B -p
+option.
+
.SH SEE ALSO
.BR rpc.gssd(8),
.SH AUTHORS
diff -up nfs-utils-1.3.0/utils/mountd/mountd.c.orig nfs-utils-1.3.0/utils/mountd/mountd.c
--- nfs-utils-1.3.0/utils/mountd/mountd.c.orig 2017-03-28 13:43:36.000000000 -0400
+++ nfs-utils-1.3.0/utils/mountd/mountd.c 2017-03-28 13:43:53.000000000 -0400
@@ -22,6 +22,8 @@
#include <fcntl.h>
#include <sys/resource.h>
#include <sys/wait.h>
+
+#include "conffile.h"
#include "xmalloc.h"
#include "misc.h"
#include "mountd.h"
@@ -39,6 +41,8 @@ int new_cache = 0;
int manage_gids;
int use_ipaddr = -1;
+char *conf_path = NFS_CONFFILE;
+
/* PRC: a high-availability callout program can be specified with -H
* When this is done, the program will receive callouts whenever clients
* send mount or unmount requests -- the callout is not needed for 2.6 kernel */
@@ -692,6 +696,7 @@ main(int argc, char **argv)
char *export_file = _PATH_EXPORTS;
char *state_dir = NFS_STATEDIR;
char *progname;
+ char *s;
unsigned int listeners = 0;
int foreground = 0;
int port = 0;
@@ -707,6 +712,38 @@ main(int argc, char **argv)
else
progname = argv[0];
+ conf_init();
+ xlog_from_conffile("mountd");
+ manage_gids = conf_get_bool("mountd", "manage-gids", manage_gids);
+ descriptors = conf_get_num("mountd", "descriptors", descriptors);
+ port = conf_get_num("mountd", "port", port);
+ num_threads = conf_get_num("mountd", "threads", num_threads);
+ reverse_resolve = conf_get_bool("mountd", "reverse-lookup", reverse_resolve);
+ ha_callout_prog = conf_get_str("mountd", "ha-callout");
+
+ s = conf_get_str("mountd", "state-directory-path");
+ if (s)
+ state_dir = s;
+
+ /* NOTE: following uses "nfsd" section of nfs.conf !!!! */
+ if (conf_get_bool("nfsd", "udp", NFSCTL_UDPISSET(_rpcprotobits)))
+ NFSCTL_UDPSET(_rpcprotobits);
+ else
+ NFSCTL_UDPUNSET(_rpcprotobits);
+ if (conf_get_bool("nfsd", "tcp", NFSCTL_TCPISSET(_rpcprotobits)))
+ NFSCTL_TCPSET(_rpcprotobits);
+ else
+ NFSCTL_TCPUNSET(_rpcprotobits);
+ for (vers = 2; vers <= 4; vers++) {
+ char tag[10];
+ sprintf(tag, "vers%d", vers);
+ if (conf_get_bool("nfsd", tag, NFSCTL_VERISSET(nfs_version, vers)))
+ NFSCTL_VERSET(nfs_version, vers);
+ else
+ NFSCTL_VERUNSET(nfs_version, vers);
+ }
+
+
/* Parse the command line options and arguments. */
opterr = 0;
while ((c = getopt_long(argc, argv, "o:nFd:f:p:P:hH:N:V:vurs:t:g", longopts, NULL)) != EOF)
diff -up nfs-utils-1.3.0/utils/mountd/mountd.man.orig nfs-utils-1.3.0/utils/mountd/mountd.man
--- nfs-utils-1.3.0/utils/mountd/mountd.man.orig 2017-03-28 13:43:36.000000000 -0400
+++ nfs-utils-1.3.0/utils/mountd/mountd.man 2017-03-28 13:43:53.000000000 -0400
@@ -207,6 +207,39 @@ the server. Note that the 'primary' grou
.B newgroup
command on the client will still be effective. This function requires
a Linux Kernel with version at least 2.6.21.
+
+.SH CONFIGURATION FILE
+Many of the options that can be set on the command line can also be
+controlled through values set in the
+.B [mountd]
+or, in some cases, the
+.B [nfsd]
+sections of the
+.I /etc/nfs.conf
+configuration file.
+Values recognized in the
+.B [mountd]
+section include
+.BR manage-gids ,
+.BR descriptors ,
+.BR port ,
+.BR threads ,
+.BR reverse-lookup ", and"
+.BR state-directory-path ,
+.B ha-callout
+which each have the same effect as the option with the same name.
+
+The values recognized in the
+.B [nfsd]
+section include
+.BR TCP ,
+.BR UDP ,
+.BR vers2 ,
+.BR vers3 ", and"
+.B vers4
+which each have same same meaning as given by
+.BR rpc.nfsd (8).
+
.SH TCP_WRAPPERS SUPPORT
You can protect your
.B rpc.mountd
@@ -261,6 +294,7 @@ table of clients accessing server's expo
.BR rpc.nfsd (8),
.BR rpc.rquotad (8),
.BR nfs (5),
+.BR nfs.conf (5),
.BR tcpd (8),
.BR hosts_access (5),
.BR iptables (8),
diff -up nfs-utils-1.3.0/utils/nfsdcltrack/nfsdcltrack.c.orig nfs-utils-1.3.0/utils/nfsdcltrack/nfsdcltrack.c
--- nfs-utils-1.3.0/utils/nfsdcltrack/nfsdcltrack.c.orig 2017-03-28 13:43:36.000000000 -0400
+++ nfs-utils-1.3.0/utils/nfsdcltrack/nfsdcltrack.c 2017-03-28 13:43:53.000000000 -0400
@@ -43,6 +43,7 @@
#include <sys/capability.h>
#endif
+#include "conffile.h"
#include "xlog.h"
#include "sqlite.h"
@@ -55,6 +56,8 @@
/* defined by RFC 3530 */
#define NFS4_OPAQUE_LIMIT 1024
+char *conf_path = NFS_CONFFILE;
+
/* private data structures */
struct cltrack_cmd {
char *name;
@@ -553,6 +556,7 @@ int
main(int argc, char **argv)
{
char arg;
+ char *val;
int rc = 0;
char *progname, *cmdarg = NULL;
struct cltrack_cmd *cmd;
@@ -562,6 +566,15 @@ main(int argc, char **argv)
xlog_syslog(1);
xlog_stderr(0);
+ conf_init();
+ xlog_from_conffile("nfsdcltrack");
+ val = conf_get_str("nfsdcltrack", "storagedir");
+ if (val)
+ storagedir = val;
+ rc = conf_get_num("nfsdcltrack", "debug", 0);
+ if (rc > 0)
+ xlog_config(D_ALL, 1);
+
/* process command-line options */
while ((arg = getopt_long(argc, argv, "hdfs:", longopts,
NULL)) != EOF) {
diff -up nfs-utils-1.3.0/utils/nfsdcltrack/nfsdcltrack.man.orig nfs-utils-1.3.0/utils/nfsdcltrack/nfsdcltrack.man
--- nfs-utils-1.3.0/utils/nfsdcltrack/nfsdcltrack.man.orig 2014-03-25 11:12:07.000000000 -0400
+++ nfs-utils-1.3.0/utils/nfsdcltrack/nfsdcltrack.man 2017-03-28 13:43:53.000000000 -0400
@@ -66,6 +66,20 @@ Check to see if a nfs_client_id4 is allo
.IP "\fBgracedone\fR" 4
.IX Item "gracedone"
Remove any unreclaimed client records from the database. This command requires a epoch boot time as an argument.
+.SH "EXTERNAL CONFIGURATION"
+The directory for stable storage information can be set via the file
+.B /etc/nfs.conf
+by setting the
+.B storagedir
+value in the
+.B nfsdcltrack
+section. For example:
+.in +5
+[nfsdcltrack]
+.br
+ storagedir = /shared/nfs/nfsdcltrack
+.in -5
+Debuging to syslog can also be enabled by setting "debug = 1" in this file.
.SH "LEGACY TRANSITION MECHANISM"
.IX Header "LEGACY TRANSITION MECHANISM"
The Linux kernel NFSv4 server has historically tracked this information
diff -up nfs-utils-1.3.0/utils/nfsd/nfsd.c.orig nfs-utils-1.3.0/utils/nfsd/nfsd.c
--- nfs-utils-1.3.0/utils/nfsd/nfsd.c.orig 2017-03-28 13:43:36.000000000 -0400
+++ nfs-utils-1.3.0/utils/nfsd/nfsd.c 2017-03-28 13:43:53.000000000 -0400
@@ -23,14 +23,18 @@
#include <netinet/in.h>
#include <arpa/inet.h>
+#include "conffile.h"
#include "nfslib.h"
#include "nfssvc.h"
#include "xlog.h"
+#include "xcommon.h"
#ifndef NFSD_NPROC
#define NFSD_NPROC 8
#endif
+char *conf_path = NFS_CONFFILE;
+
static void usage(const char *);
static struct option longopts[] =
@@ -51,50 +55,6 @@ static struct option longopts[] =
{ NULL, 0, 0, 0 }
};
-/* given a family and ctlbits, disable any that aren't listed in netconfig */
-#ifdef HAVE_LIBTIRPC
-static void
-nfsd_enable_protos(unsigned int *proto4, unsigned int *proto6)
-{
- struct netconfig *nconf;
- unsigned int *famproto;
- void *handle;
-
- xlog(D_GENERAL, "Checking netconfig for visible protocols.");
-
- handle = setnetconfig();
- while((nconf = getnetconfig(handle))) {
- if (!(nconf->nc_flag & NC_VISIBLE))
- continue;
-
- if (!strcmp(nconf->nc_protofmly, NC_INET))
- famproto = proto4;
- else if (!strcmp(nconf->nc_protofmly, NC_INET6))
- famproto = proto6;
- else
- continue;
-
- if (!strcmp(nconf->nc_proto, NC_TCP))
- NFSCTL_TCPSET(*famproto);
- else if (!strcmp(nconf->nc_proto, NC_UDP))
- NFSCTL_UDPSET(*famproto);
-
- xlog(D_GENERAL, "Enabling %s %s.", nconf->nc_protofmly,
- nconf->nc_proto);
- }
- endnetconfig(handle);
- return;
-}
-#else /* HAVE_LIBTIRPC */
-static void
-nfsd_enable_protos(unsigned int *proto4, unsigned int *proto6)
-{
- /* Enable all IPv4 protocols if no TIRPC support */
- *proto4 = NFSCTL_ALLBITS;
- *proto6 = 0;
-}
-#endif /* HAVE_LIBTIRPC */
-
int
main(int argc, char **argv)
{
@@ -102,44 +62,91 @@ main(int argc, char **argv)
char *p, *progname, *port, *rdma_port = NULL;
char **haddr = NULL;
int hcounter = 0;
+ struct conf_list *hosts;
int socket_up = 0;
unsigned int minorvers = 0;
unsigned int minorversset = 0;
unsigned int versbits = NFSCTL_VERDEFAULT;
unsigned int protobits = NFSCTL_ALLBITS;
- unsigned int proto4 = 0;
- unsigned int proto6 = 0;
int grace = -1;
int lease = -1;
- progname = strdup(basename(argv[0]));
- if (!progname) {
- fprintf(stderr, "%s: unable to allocate memory.\n", argv[0]);
- exit(1);
- }
-
- port = strdup("nfs");
- if (!port) {
- fprintf(stderr, "%s: unable to allocate memory.\n", progname);
- exit(1);
- }
-
- haddr = malloc(sizeof(char *));
- if (!haddr) {
- fprintf(stderr, "%s: unable to allocate memory.\n", progname);
- exit(1);
- }
+ progname = basename(argv[0]);
+ haddr = xmalloc(sizeof(char *));
haddr[0] = NULL;
xlog_syslog(0);
xlog_stderr(1);
+ conf_init();
+ xlog_from_conffile("nfsd");
+ count = conf_get_num("nfsd", "threads", count);
+ grace = conf_get_num("nfsd", "grace-time", grace);
+ lease = conf_get_num("nfsd", "lease-time", lease);
+ port = conf_get_str("nfsd", "port");
+ if (!port)
+ port = "nfs";
+ rdma_port = conf_get_str("nfsd", "rdma");
+ if (conf_get_bool("nfsd", "udp", NFSCTL_UDPISSET(protobits)))
+ NFSCTL_UDPSET(protobits);
+ else
+ NFSCTL_UDPUNSET(protobits);
+ if (conf_get_bool("nfsd", "tcp", NFSCTL_TCPISSET(protobits)))
+ NFSCTL_TCPSET(protobits);
+ else
+ NFSCTL_TCPUNSET(protobits);
+ for (i = 2; i <= 4; i++) {
+ char tag[10];
+ sprintf(tag, "vers%d", i);
+ if (conf_get_bool("nfsd", tag, NFSCTL_VERISSET(versbits, i)))
+ NFSCTL_VERSET(versbits, i);
+ else
+ NFSCTL_VERUNSET(versbits, i);
+ }
+ /* We assume the kernel will default all minor versions to 'on',
+ * and allow the config file to disable some.
+ */
+ for (i = NFS4_MINMINOR; i <= NFS4_MAXMINOR; i++) {
+ char tag[20];
+ sprintf(tag, "vers4.%d", i);
+ /* The default for minor version support is to let the
+ * kernel decide. We could ask the kernel what that choice
+ * will be, but that is needlessly complex.
+ * Instead, perform a config-file lookup using each of the
+ * two possible default. If the result is different from the
+ * default, then impose that value, else don't make a change
+ * (i.e. don't set the bit in minorversset).
+ */
+ if (!conf_get_bool("nfsd", tag, 1)) {
+ NFSCTL_VERSET(minorversset, i);
+ NFSCTL_VERUNSET(minorvers, i);
+ }
+ if (conf_get_bool("nfsd", tag, 0)) {
+ NFSCTL_VERSET(minorversset, i);
+ NFSCTL_VERSET(minorvers, i);
+ }
+ }
+
+ hosts = conf_get_list("nfsd", "host");
+ if (hosts && hosts->cnt) {
+ struct conf_list_node *n;
+ haddr = realloc(haddr, sizeof(char*) * hosts->cnt);
+ TAILQ_FOREACH(n, &(hosts->fields), link) {
+ haddr[hcounter] = n->field;
+ hcounter++;
+ }
+ }
+
while ((c = getopt_long(argc, argv, "dH:hN:V:p:P:sTUrG:L:", longopts, NULL)) != EOF) {
switch(c) {
case 'd':
xlog_config(D_ALL, 1);
break;
case 'H':
+ if (hosts) {
+ hosts = NULL;
+ hcounter = 0;
+ }
if (hcounter) {
haddr = realloc(haddr, sizeof(char*) * hcounter+1);
if(!haddr) {
@@ -148,30 +155,13 @@ main(int argc, char **argv)
exit(1);
}
}
- haddr[hcounter] = strdup(optarg);
- if (!haddr[hcounter]) {
- fprintf(stderr, "%s: unable to allocate "
- "memory.\n", progname);
- exit(1);
- }
+ haddr[hcounter] = optarg;
hcounter++;
break;
case 'P': /* XXX for nfs-server compatibility */
case 'p':
/* only the last -p option has any effect */
- portnum = atoi(optarg);
- if (portnum <= 0 || portnum > 65535) {
- fprintf(stderr, "%s: bad port number: %s\n",
- progname, optarg);
- usage(progname);
- }
- free(port);
- port = strdup(optarg);
- if (!port) {
- fprintf(stderr, "%s: unable to allocate "
- "memory.\n", progname);
- exit(1);
- }
+ port = optarg;
break;
case 'r':
rdma_port = "nfsrdma";
@@ -188,7 +178,7 @@ main(int argc, char **argv)
case 4:
if (*p == '.') {
int i = atoi(p+1);
- if (i > NFS4_MAXMINOR) {
+ if (i < NFS4_MINMINOR || i > NFS4_MAXMINOR) {
fprintf(stderr, "%s: unsupported minor version\n", optarg);
exit(1);
}
@@ -210,7 +200,7 @@ main(int argc, char **argv)
case 4:
if (*p == '.') {
int i = atoi(p+1);
- if (i > NFS4_MAXMINOR) {
+ if (i < NFS4_MINMINOR || i > NFS4_MAXMINOR) {
fprintf(stderr, "%s: unsupported minor version\n", optarg);
exit(1);
}
@@ -277,18 +267,6 @@ main(int argc, char **argv)
xlog_open(progname);
- nfsd_enable_protos(&proto4, &proto6);
-
- if (!NFSCTL_TCPISSET(protobits)) {
- NFSCTL_TCPUNSET(proto4);
- NFSCTL_TCPUNSET(proto6);
- }
-
- if (!NFSCTL_UDPISSET(protobits)) {
- NFSCTL_UDPUNSET(proto4);
- NFSCTL_UDPUNSET(proto6);
- }
-
/* make sure that at least one version is enabled */
found_one = 0;
for (c = NFSD_MINVERS; c <= NFSD_MAXVERS; c++) {
@@ -301,8 +279,7 @@ main(int argc, char **argv)
}
if (NFSCTL_VERISSET(versbits, 4) &&
- !NFSCTL_TCPISSET(proto4) &&
- !NFSCTL_TCPISSET(proto6)) {
+ !NFSCTL_TCPISSET(protobits)) {
xlog(L_ERROR, "version 4 requires the TCP protocol");
exit(1);
}
@@ -336,15 +313,10 @@ main(int argc, char **argv)
i = 0;
do {
- error = nfssvc_set_sockets(AF_INET, proto4, haddr[i], port);
- if (!error)
- socket_up = 1;
-#ifdef IPV6_SUPPORTED
- error = nfssvc_set_sockets(AF_INET6, proto6, haddr[i], port);
+ error = nfssvc_set_sockets(protobits, haddr[i], port);
if (!error)
socket_up = 1;
-#endif /* IPV6_SUPPORTED */
- } while (++i < hcounter);
+ } while (++i < hcounter);
if (rdma_port) {
error = nfssvc_set_rdmaport(rdma_port);
@@ -381,11 +353,7 @@ set_threads:
if ((error = nfssvc_threads(portnum, count)) < 0)
xlog(L_ERROR, "error starting threads: errno %d (%m)", errno);
out:
- free(port);
- for(i=0; i < hcounter; i++)
- free(haddr[i]);
free(haddr);
- free(progname);
return (error != 0);
}
diff -up nfs-utils-1.3.0/utils/nfsd/nfsd.man.orig nfs-utils-1.3.0/utils/nfsd/nfsd.man
--- nfs-utils-1.3.0/utils/nfsd/nfsd.man.orig 2014-03-25 11:12:07.000000000 -0400
+++ nfs-utils-1.3.0/utils/nfsd/nfsd.man 2017-03-28 13:43:53.000000000 -0400
@@ -57,7 +57,7 @@ This option can be used to request that
.B rpc.nfsd
does not offer certain versions of NFS. The current version of
.B rpc.nfsd
-can support NFS versions 2,3,4 and the newer version 4.1.
+can support major NFS versions 2,3,4 and the minor versions 4.1 and 4.2.
.TP
.B \-s " or " \-\-syslog
By default,
@@ -82,7 +82,7 @@ This option can be used to request that
.B rpc.nfsd
offer certain versions of NFS. The current version of
.B rpc.nfsd
-can support NFS versions 2,3,4 and the newer version 4.1.
+can support major NFS versions 2,3,4 and the minor versions 4.1 and 4.2.
.TP
.B \-L " or " \-\-lease-time seconds
Set the lease-time used for NFSv4. This corresponds to how often
@@ -95,11 +95,11 @@ New file open requests (NFSv4) and new f
allowed until after this time has passed to allow clients to recover state.
.TP
.I nproc
-specify the number of NFS server threads. By default, just one
-thread is started. However, for optimum performance several threads
+specify the number of NFS server threads. By default, eight
+threads are started. However, for optimum performance several threads
should be used. The actual figure depends on the number of and the work
load created by the NFS clients, but a useful starting point is
-8 threads. Effects of modifying that number can be checked using
+eight threads. Effects of modifying that number can be checked using
the
.BR nfsstat (8)
program.
@@ -114,6 +114,58 @@ In particular
.B rpc.nfsd 0
will stop all threads and thus close any open connections.
+.SH CONFIGURATION FILE
+Many of the options that can be set on the command line can also be
+controlled through values set in the
+.B [nfsd]
+section of the
+.I /etc/nfs.conf
+configuration file. Values recognized include:
+.TP
+.B threads
+The number of threads to start.
+.TP
+.B host
+A host name, or comma separated list of host names, that
+.I rpc.nfsd
+will listen on. Use of the
+.B --host
+option replaces all host names listed here.
+.TP
+.B grace-time
+The grace time, for both NFSv4 and NLM, in seconds.
+.TP
+.B lease-time
+The lease time for NFSv4, in seconds.
+.TP
+.B port
+Set the port for TCP/UDP to bind to.
+.TP
+.B rdma
+Set RDMA port. Use "rdma=nfsrdma" to enable standard port.
+.TP
+.B UDP
+Enable (with "on" or "yes" etc) or disable ("off", "no") UDP support.
+.TP
+.B TCP
+Enable or disable TCP support.
+.TP
+.B vers2
+.TP
+.B vers3
+.TP
+.B vers4
+Enable or disable a major NFS version. 3 and 4 are normally enabled
+by default.
+.TP
+.B vers4.1
+.TP
+.B vers4.2
+Setting these to "off" or similar will disable the selected minor
+versions. Setting to "on" will enable them. The default values
+are determined by the kernel, and usually minor versions default to
+being enabled once the implementation is sufficiently complete.
+
.SH NOTES
If the program is built with TI-RPC support, it will enable any protocol and
address family combinations that are marked visible in the
@@ -124,6 +176,7 @@ database.
.BR rpc.mountd (8),
.BR exports (5),
.BR exportfs (8),
+.BR nfs.conf (5),
.BR rpc.rquotad (8),
.BR nfsstat (8),
.BR netconfig(5).
diff -up nfs-utils-1.3.0/utils/nfsd/nfssvc.c.orig nfs-utils-1.3.0/utils/nfsd/nfssvc.c
--- nfs-utils-1.3.0/utils/nfsd/nfssvc.c.orig 2017-03-28 13:43:36.000000000 -0400
+++ nfs-utils-1.3.0/utils/nfsd/nfssvc.c 2017-03-28 13:43:53.000000000 -0400
@@ -23,6 +23,7 @@
#include "nfslib.h"
#include "xlog.h"
+#include "nfssvc.h"
#ifndef NFSD_FS_DIR
#define NFSD_FS_DIR "/proc/fs/nfsd"
@@ -123,22 +124,6 @@ nfssvc_setfds(const struct addrinfo *hin
if (fd < 0)
return 0;
- switch(hints->ai_family) {
- case AF_INET:
- family = "inet";
- break;
-#ifdef IPV6_SUPPORTED
- case AF_INET6:
- family = "inet6";
- break;
-#endif /* IPV6_SUPPORTED */
- default:
- xlog(L_ERROR, "Unknown address family specified: %d\n",
- hints->ai_family);
- rc = EAFNOSUPPORT;
- goto error;
- }
-
rc = getaddrinfo(node, port, hints, &addrhead);
if (rc == EAI_NONAME && !strcmp(port, "nfs")) {
snprintf(buf, sizeof(buf), "%d", NFS_PORT);
@@ -146,10 +131,10 @@ nfssvc_setfds(const struct addrinfo *hin
}
if (rc != 0) {
- xlog(L_ERROR, "unable to resolve %s:%s to %s address: "
- "%s", node ? node : "ANYADDR", port, family,
- rc == EAI_SYSTEM ? strerror(errno) :
- gai_strerror(rc));
+ xlog(L_ERROR, "unable to resolve %s:%s: %s",
+ node ? node : "ANYADDR", port,
+ rc == EAI_SYSTEM ? strerror(errno) :
+ gai_strerror(rc));
goto error;
}
@@ -168,6 +153,20 @@ nfssvc_setfds(const struct addrinfo *hin
continue;
}
+ switch(addr->ai_addr->sa_family) {
+ case AF_INET:
+ family = "AF_INET";
+ break;
+#ifdef IPV6_SUPPORTED
+ case AF_INET6:
+ family = "AF_INET6";
+ break;
+#endif /* IPV6_SUPPORTED */
+ default:
+ addr = addr->ai_next;
+ continue;
+ }
+
xlog(D_GENERAL, "Creating %s %s socket.", family, proto);
/* open socket and prepare to hand it off to kernel */
@@ -251,12 +250,16 @@ error:
}
int
-nfssvc_set_sockets(const int family, const unsigned int protobits,
+nfssvc_set_sockets(const unsigned int protobits,
const char *host, const char *port)
{
struct addrinfo hints = { .ai_flags = AI_PASSIVE };
- hints.ai_family = family;
+#ifdef IPV6_SUPPORTED
+ hints.ai_family = AF_UNSPEC;
+#else /* IPV6_SUPPORTED */
+ hints.ai_family = AF_INET;
+#endif /* IPV6_SUPPORTED */
if (!NFSCTL_ANYPROTO(protobits))
return EPROTOTYPE;
diff -up nfs-utils-1.3.0/utils/nfsd/nfssvc.h.orig nfs-utils-1.3.0/utils/nfsd/nfssvc.h
--- nfs-utils-1.3.0/utils/nfsd/nfssvc.h.orig 2014-03-25 11:12:07.000000000 -0400
+++ nfs-utils-1.3.0/utils/nfsd/nfssvc.h 2017-03-28 13:43:53.000000000 -0400
@@ -22,7 +22,7 @@
void nfssvc_mount_nfsdfs(char *progname);
int nfssvc_inuse(void);
-int nfssvc_set_sockets(const int family, const unsigned int protobits,
+int nfssvc_set_sockets(const unsigned int protobits,
const char *host, const char *port);
void nfssvc_set_time(const char *type, const int seconds);
int nfssvc_set_rdmaport(const char *port);
diff -up nfs-utils-1.3.0/utils/statd/sm-notify.c.orig nfs-utils-1.3.0/utils/statd/sm-notify.c
--- nfs-utils-1.3.0/utils/statd/sm-notify.c.orig 2014-03-25 11:12:07.000000000 -0400
+++ nfs-utils-1.3.0/utils/statd/sm-notify.c 2017-03-28 13:43:53.000000000 -0400
@@ -29,6 +29,7 @@
#include <errno.h>
#include <grp.h>
+#include "conffile.h"
#include "sockaddr.h"
#include "xlog.h"
#include "nsm.h"
@@ -64,6 +65,7 @@ static _Bool opt_update_state = true;
static unsigned int opt_max_retry = 15 * 60;
static char * opt_srcaddr = NULL;
static char * opt_srcport = NULL;
+char * conf_path = NFS_CONFFILE;
static void notify(const int sock);
static int notify_host(int, struct nsm_host *);
@@ -455,6 +457,7 @@ main(int argc, char **argv)
{
int c, sock, force = 0;
char * progname;
+ char * s;
progname = strrchr(argv[0], '/');
if (progname != NULL)
@@ -462,6 +465,15 @@ main(int argc, char **argv)
else
progname = argv[0];
+ conf_init();
+ xlog_from_conffile("sm-notify");
+ opt_max_retry = conf_get_num("sm-notify", "retry-time", opt_max_retry / 60) * 60;
+ opt_srcport = conf_get_str("sm-notify", "outgoing-port");
+ opt_srcaddr = conf_get_str("sm-notify", "outgoing-addr");
+ s = conf_get_str("statd", "state-directory-path");
+ if (s && !nsm_setup_pathnames(argv[0], s))
+ exit(1);
+
while ((c = getopt(argc, argv, "dm:np:v:P:f")) != -1) {
switch (c) {
case 'f':
diff -up nfs-utils-1.3.0/utils/statd/sm-notify.man.orig nfs-utils-1.3.0/utils/statd/sm-notify.man
--- nfs-utils-1.3.0/utils/statd/sm-notify.man.orig 2014-03-25 11:12:07.000000000 -0400
+++ nfs-utils-1.3.0/utils/statd/sm-notify.man 2017-03-28 13:43:53.000000000 -0400
@@ -219,6 +219,33 @@ argument when sending SM_NOTIFY requests
.IP
This option can be useful in multi-homed configurations where
the remote requires notification from a specific network address.
+.SH CONFIGURATION FILE
+Many of the options that can be set on the command line can also be
+controlled through values set in the
+.B [sm-notify]
+or, in one case, the
+.B [statd]
+section of the
+.I /etc/nfs.conf
+configuration file.
+
+Values recognized in the
+.B [sm-notify]
+section include:
+.BR retry-time ,
+.BR outgoing-port ", and"
+.BR outgoing-addr .
+These have the same effect as the command line options
+.BR m ,
+.BR p ", and"
+.B v
+respectively.
+
+The value recognized in the
+.B [statd]
+section is
+.BR state-directory-path .
+
.SH SECURITY
The
.B sm-notify
diff -up nfs-utils-1.3.0/utils/statd/statd.c.orig nfs-utils-1.3.0/utils/statd/statd.c
--- nfs-utils-1.3.0/utils/statd/statd.c.orig 2017-03-28 13:43:36.000000000 -0400
+++ nfs-utils-1.3.0/utils/statd/statd.c 2017-03-28 13:43:53.000000000 -0400
@@ -26,6 +26,7 @@
#include <sys/wait.h>
#include <grp.h>
+#include "conffile.h"
#include "statd.h"
#include "nfslib.h"
#include "nfsrpc.h"
@@ -36,6 +37,7 @@
#include <sys/socket.h>
int run_mode = 0; /* foreground logging mode */
+char *conf_path = NFS_CONFFILE;
/* LH - I had these local to main, but it seemed silly to have
* two copies of each - one in main(), one static in log.c...
@@ -242,15 +244,21 @@ static void set_nlm_port(char *type, int
int main (int argc, char **argv)
{
extern char *optarg;
+ char *s;
int pid;
int arg;
int port = 0, out_port = 0;
int nlm_udp = 0, nlm_tcp = 0;
struct rlimit rlim;
+ char *env;
/* Default: daemon mode, no other options */
run_mode = 0;
+ env = getenv("RPC_STATD_NO_NOTIFY");
+ if (env && atoi(env) > 0)
+ run_mode |= MODE_NO_NOTIFY;
+
/* Log to stderr if there's an error during startup */
xlog_stderr(1);
xlog_syslog(0);
@@ -265,6 +273,24 @@ int main (int argc, char **argv)
/* Set hostname */
MY_NAME = NULL;
+ conf_init();
+ xlog_from_conffile("statd");
+ out_port = conf_get_num("statd", "outgoing-port", out_port);
+ port = conf_get_num("statd", "port", port);
+ MY_NAME = conf_get_str("statd", "name");
+ if (MY_NAME)
+ run_mode |= STATIC_HOSTNAME;
+ s = conf_get_str("statd", "state-directory-path");
+ if (s && !nsm_setup_pathnames(argv[0], s))
+ exit(1);
+ s = conf_get_str("statd", "ha-callout");
+ if (s)
+ ha_callout_prog = s;
+
+ nlm_tcp = conf_get_num("lockd", "port", nlm_tcp);
+ /* udp defaults to the same as tcp ! */
+ nlm_udp = conf_get_num("lockd", "udp-port", nlm_tcp);
+
/* Process command line switches */
while ((arg = getopt_long(argc, argv, "h?vVFNH:dn:p:o:P:LT:U:", longopts, NULL)) != EOF) {
switch (arg) {
diff -up nfs-utils-1.3.0/utils/statd/statd.man.orig nfs-utils-1.3.0/utils/statd/statd.man
--- nfs-utils-1.3.0/utils/statd/statd.man.orig 2017-03-28 13:43:36.000000000 -0400
+++ nfs-utils-1.3.0/utils/statd/statd.man 2017-03-28 13:43:53.000000000 -0400
@@ -8,7 +8,7 @@
.\" Rewritten by Chuck Lever <chuck.lever@oracle.com>, 2009.
.\" Copyright 2009 Oracle. All rights reserved.
.\"
-.TH RPC.STATD 8 "1 November 2009
+.TH RPC.STATD 8 "1 November 2009"
.SH NAME
rpc.statd \- NSM service daemon
.SH SYNOPSIS
@@ -247,7 +247,7 @@ should listen on for
.B NLM
requests.
.TP
-.BI "\-P, " "" \-\-state\-directory\-path " pathname
+.BI "\-P, " "" \-\-state\-directory\-path " pathname"
Specifies the pathname of the parent directory
where NSM state information resides.
If this option is not specified,
@@ -267,6 +267,37 @@ Causes
to display version information on
.I stderr
and then exit.
+.SH CONFIGURATION FILE
+Many of the options that can be set on the command line can also be
+controlled through values set in the
+.B [statd]
+or, in some cases, the
+.B [lockd]
+sections of the
+.I /etc/nfs.conf
+configuration file.
+Values recognized in the
+.B [statd]
+section include
+.BR port ,
+.BR outgoing-port ,
+.BR name ,
+.BR state-directory-path ", and"
+.B ha-callout
+which each have the same effect as the option with the same name.
+
+The values recognized in the
+.B [lockd]
+section include
+.B port
+and
+.B udp-port
+which have the same effect as the
+.B --nlm-port
+and
+.B --nlm-udp-port
+options, respectively.
+
.SH SECURITY
The
.B rpc.statd
@@ -387,6 +418,11 @@ it attempts to start listeners on networ
As long as at least one network transport listener starts successfully,
.B rpc.statd
will operate.
+.SH ENVIRONMENT
+.TP
+.B RPC_STATD_NO_NOTIFY=
+If set to a positive integer, has the same effect as
+.IR \-\-no\-notify .
.SH FILES
.TP 2.5i
.I /var/lib/nfs/sm