import nfs-utils-2.3.3-51.el8
This commit is contained in:
		
							parent
							
								
									39bd9e53dd
								
							
						
					
					
						commit
						d551f79e6d
					
				
							
								
								
									
										14
									
								
								SOURCES/nfs-utils-2.3.3-gssd-printerr.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								SOURCES/nfs-utils-2.3.3-gssd-printerr.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| diff -up nfs-utils-2.3.3/utils/gssd/krb5_util.c.orig nfs-utils-2.3.3/utils/gssd/krb5_util.c
 | ||||
| --- nfs-utils-2.3.3/utils/gssd/krb5_util.c.orig	2021-11-04 10:13:07.788142847 -0400
 | ||||
| +++ nfs-utils-2.3.3/utils/gssd/krb5_util.c	2021-11-04 10:14:10.829841090 -0400
 | ||||
| @@ -647,8 +647,8 @@ get_full_hostname(const char *inhost, ch
 | ||||
|  	    *c = tolower(*c); | ||||
|   | ||||
|  	if (get_verbosity() && strcmp(inhost, outhost)) | ||||
| -		printerr(1, "%s(0x%0lx): inhost '%s' different than outhost'%s'\n", 
 | ||||
| -			inhost, outhost);
 | ||||
| +		printerr(1, "%s(0x%0lx): inhost '%s' different than outhost '%s'\n", 
 | ||||
| +			 __func__, tid, inhost, outhost);
 | ||||
|   | ||||
|  	retval = 0; | ||||
|  out: | ||||
							
								
								
									
										14
									
								
								SOURCES/nfs-utils-2.3.3-mount-ebusy.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								SOURCES/nfs-utils-2.3.3-mount-ebusy.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| diff -up nfs-utils-2.3.3/utils/mount/stropts.c.orig nfs-utils-2.3.3/utils/mount/stropts.c
 | ||||
| --- nfs-utils-2.3.3/utils/mount/stropts.c.orig	2022-02-14 11:28:51.570084952 -0500
 | ||||
| +++ nfs-utils-2.3.3/utils/mount/stropts.c	2022-02-14 11:29:16.174450628 -0500
 | ||||
| @@ -966,7 +966,9 @@ fall_back:
 | ||||
|  	if ((result = nfs_try_mount_v3v2(mi, FALSE))) | ||||
|  		return result; | ||||
|   | ||||
| -	errno = olderrno;
 | ||||
| +	if (errno != EBUSY && errno != EACCES)
 | ||||
| +		errno = olderrno;
 | ||||
| +
 | ||||
|  	return result; | ||||
|  } | ||||
|   | ||||
							
								
								
									
										976
									
								
								SOURCES/nfs-utils-2.3.3-mountd-v4-logging.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										976
									
								
								SOURCES/nfs-utils-2.3.3-mountd-v4-logging.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,976 @@ | ||||
| diff --git a/nfs.conf b/nfs.conf
 | ||||
| index 05247ff9..86ed7d53 100644
 | ||||
| --- a/nfs.conf
 | ||||
| +++ b/nfs.conf
 | ||||
| @@ -38,6 +38,8 @@ use-gss-proxy=1
 | ||||
|  # reverse-lookup=n | ||||
|  # state-directory-path=/var/lib/nfs | ||||
|  # ha-callout= | ||||
| +# cache-use-ipaddr=n
 | ||||
| +# ttl=1800
 | ||||
|  # | ||||
|  [nfsdcld] | ||||
|  # debug=0 | ||||
| diff --git a/support/export/Makefile.am b/support/export/Makefile.am
 | ||||
| index 13f7a49c..d6ee502f 100644
 | ||||
| --- a/support/export/Makefile.am
 | ||||
| +++ b/support/export/Makefile.am
 | ||||
| @@ -11,7 +11,8 @@ EXTRA_DIST	= mount.x
 | ||||
|   | ||||
|  noinst_LIBRARIES = libexport.a | ||||
|  libexport_a_SOURCES = client.c export.c hostname.c \ | ||||
| -		      xtab.c mount_clnt.c mount_xdr.c
 | ||||
| +		      xtab.c mount_clnt.c mount_xdr.c \
 | ||||
| +			  cache.c auth.c v4root.c v4clients.c
 | ||||
|  BUILT_SOURCES 	= $(GENFILES) | ||||
|   | ||||
|  noinst_HEADERS = mount.h | ||||
| diff --git a/utils/mountd/auth.c b/support/export/auth.c
 | ||||
| similarity index 98% | ||||
| rename from utils/mountd/auth.c | ||||
| rename to support/export/auth.c | ||||
| index 8299256e..73ad6f73 100644
 | ||||
| --- a/utils/mountd/auth.c
 | ||||
| +++ b/support/export/auth.c
 | ||||
| @@ -22,7 +22,7 @@
 | ||||
|  #include "misc.h" | ||||
|  #include "nfslib.h" | ||||
|  #include "exportfs.h" | ||||
| -#include "mountd.h"
 | ||||
| +#include "export.h"
 | ||||
|  #include "v4root.h" | ||||
|   | ||||
|  enum auth_error | ||||
| @@ -43,11 +43,13 @@ extern int use_ipaddr;
 | ||||
|   | ||||
|  extern struct state_paths etab; | ||||
|   | ||||
| +/*
 | ||||
|  void | ||||
|  auth_init(void) | ||||
|  { | ||||
|  	auth_reload(); | ||||
|  } | ||||
| +*/
 | ||||
|   | ||||
|  /* | ||||
|   * A client can match many different netgroups and it's tough to know | ||||
| @@ -64,6 +66,10 @@ check_useipaddr(void)
 | ||||
|  	int old_use_ipaddr = use_ipaddr; | ||||
|  	unsigned int len = 0; | ||||
|   | ||||
| +	if (use_ipaddr > 1)
 | ||||
| +		/* fixed - don't check */
 | ||||
| +		return;
 | ||||
| +
 | ||||
|  	/* add length of m_hostname + 1 for the comma */ | ||||
|  	for (clp = clientlist[MCL_NETGROUP]; clp; clp = clp->m_next) | ||||
|  		len += (strlen(clp->m_hostname) + 1); | ||||
| diff --git a/utils/mountd/cache.c b/support/export/cache.c
 | ||||
| similarity index 95% | ||||
| rename from utils/mountd/cache.c | ||||
| rename to support/export/cache.c | ||||
| index c73e29be..98d50828 100644
 | ||||
| --- a/utils/mountd/cache.c
 | ||||
| +++ b/support/export/cache.c
 | ||||
| @@ -29,21 +29,18 @@
 | ||||
|  #include "misc.h" | ||||
|  #include "nfslib.h" | ||||
|  #include "exportfs.h" | ||||
| -#include "mountd.h"
 | ||||
| -#include "fsloc.h"
 | ||||
| +#include "export.h"
 | ||||
|  #include "pseudoflavors.h" | ||||
|  #include "xcommon.h" | ||||
|   | ||||
| +#ifdef HAVE_JUNCTION_SUPPORT
 | ||||
| +#include "../../utils/mountd/fsloc.h"
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  #ifdef USE_BLKID | ||||
|  #include "blkid/blkid.h" | ||||
|  #endif | ||||
|   | ||||
| -/*
 | ||||
| - * Invoked by RPC service loop
 | ||||
| - */
 | ||||
| -void	cache_set_fds(fd_set *fdset);
 | ||||
| -int	cache_process_req(fd_set *readfds);
 | ||||
| -
 | ||||
|  enum nfsd_fsid { | ||||
|  	FSID_DEV = 0, | ||||
|  	FSID_NUM, | ||||
| @@ -63,7 +60,6 @@ enum nfsd_fsid {
 | ||||
|   * Record is terminated with newline. | ||||
|   * | ||||
|   */ | ||||
| -static int cache_export_ent(char *buf, int buflen, char *domain, struct exportent *exp, char *path);
 | ||||
|   | ||||
|  #define INITIAL_MANAGED_GROUPS 100 | ||||
|   | ||||
| @@ -81,6 +77,7 @@ static void auth_unix_ip(int f)
 | ||||
|  	char class[20]; | ||||
|  	char ipaddr[INET6_ADDRSTRLEN + 1]; | ||||
|  	char *client = NULL; | ||||
| +	struct addrinfo *ai = NULL;
 | ||||
|  	struct addrinfo *tmp = NULL; | ||||
|  	char buf[RPC_CHAN_BUF_SIZE], *bp; | ||||
|  	int blen; | ||||
| @@ -106,21 +103,26 @@ static void auth_unix_ip(int f)
 | ||||
|   | ||||
|  	auth_reload(); | ||||
|   | ||||
| -	/* addr is a valid, interesting address, find the domain name... */
 | ||||
| -	if (!use_ipaddr) {
 | ||||
| -		struct addrinfo *ai = NULL;
 | ||||
| -
 | ||||
| -		ai = client_resolve(tmp->ai_addr);
 | ||||
| -		if (ai) {
 | ||||
| -			client = client_compose(ai);
 | ||||
| -			freeaddrinfo(ai);
 | ||||
| -		}
 | ||||
| +	/* addr is a valid address, find the domain name... */
 | ||||
| +	ai = client_resolve(tmp->ai_addr);
 | ||||
| +	if (ai) {
 | ||||
| +		client = client_compose(ai);
 | ||||
| +		freeaddrinfo(ai);
 | ||||
|  	} | ||||
| +	if (!client)
 | ||||
| +		xlog(D_AUTH, "failed authentication for IP %s", ipaddr);
 | ||||
| +	else if	(!use_ipaddr)
 | ||||
| +		xlog(D_AUTH, "successful authentication for IP %s as %s",
 | ||||
| +		     ipaddr, *client ? client : "DEFAULT");
 | ||||
| +	else
 | ||||
| +		xlog(D_AUTH, "successful authentication for IP %s",
 | ||||
| +			     ipaddr);
 | ||||
| +
 | ||||
|  	bp = buf; blen = sizeof(buf); | ||||
|  	qword_add(&bp, &blen, "nfsd"); | ||||
|  	qword_add(&bp, &blen, ipaddr); | ||||
| -	qword_adduint(&bp, &blen, time(0) + DEFAULT_TTL);
 | ||||
| -	if (use_ipaddr) {
 | ||||
| +	qword_adduint(&bp, &blen, time(0) + default_ttl);
 | ||||
| +	if (use_ipaddr && client) {
 | ||||
|  		memmove(ipaddr + 1, ipaddr, strlen(ipaddr) + 1); | ||||
|  		ipaddr[0] = '$'; | ||||
|  		qword_add(&bp, &blen, ipaddr); | ||||
| @@ -192,7 +194,7 @@ static void auth_unix_gid(int f)
 | ||||
|   | ||||
|  	bp = buf; blen = sizeof(buf); | ||||
|  	qword_adduint(&bp, &blen, uid); | ||||
| -	qword_adduint(&bp, &blen, time(0) + DEFAULT_TTL);
 | ||||
| +	qword_adduint(&bp, &blen, time(0) + default_ttl);
 | ||||
|  	if (rv >= 0) { | ||||
|  		qword_adduint(&bp, &blen, ngroups); | ||||
|  		for (i=0; i<ngroups; i++) | ||||
| @@ -688,7 +690,6 @@ static void nfsd_fh(int f)
 | ||||
|  	char *found_path = NULL; | ||||
|  	nfs_export *exp; | ||||
|  	int i; | ||||
| -	int dev_missing = 0;
 | ||||
|  	char buf[RPC_CHAN_BUF_SIZE], *bp; | ||||
|  	int blen; | ||||
|   | ||||
| @@ -755,11 +756,6 @@ static void nfsd_fh(int f)
 | ||||
|  			if (!is_ipaddr_client(dom) | ||||
|  					&& !namelist_client_matches(exp, dom)) | ||||
|  				continue; | ||||
| -			if (exp->m_export.e_mountpoint &&
 | ||||
| -			    !is_mountpoint(exp->m_export.e_mountpoint[0]?
 | ||||
| -					   exp->m_export.e_mountpoint:
 | ||||
| -					   exp->m_export.e_path))
 | ||||
| -				dev_missing ++;
 | ||||
|   | ||||
|  			if (!match_fsid(&parsed, exp, path)) | ||||
|  				continue; | ||||
| @@ -794,7 +790,7 @@ static void nfsd_fh(int f)
 | ||||
|  	    !is_mountpoint(found->e_mountpoint[0]? | ||||
|  			   found->e_mountpoint: | ||||
|  			   found->e_path)) { | ||||
| -		/* Cannot export this yet 
 | ||||
| +		/* Cannot export this yet
 | ||||
|  		 * should log a warning, but need to rate limit | ||||
|  		   xlog(L_WARNING, "%s not exported as %d not a mountpoint", | ||||
|  		   found->e_path, found->e_mountpoint); | ||||
| @@ -802,16 +798,6 @@ static void nfsd_fh(int f)
 | ||||
|  		/* FIXME we need to make sure we re-visit this later */ | ||||
|  		goto out; | ||||
|  	} | ||||
| -	if (!found && dev_missing) {
 | ||||
| -		/* The missing dev could be what we want, so just be
 | ||||
| -		 * quite rather than returning stale yet
 | ||||
| -		 */
 | ||||
| -		goto out;
 | ||||
| -	}
 | ||||
| -
 | ||||
| -	if (found)
 | ||||
| -		if (cache_export_ent(buf, sizeof(buf), dom, found, found_path) < 0)
 | ||||
| -			found = 0;
 | ||||
|   | ||||
|  	bp = buf; blen = sizeof(buf); | ||||
|  	qword_add(&bp, &blen, dom); | ||||
| @@ -831,6 +817,8 @@ static void nfsd_fh(int f)
 | ||||
|  	qword_addeol(&bp, &blen); | ||||
|  	if (blen <= 0 || write(f, buf, bp - buf) != bp - buf) | ||||
|  		xlog(L_ERROR, "nfsd_fh: error writing reply"); | ||||
| +	if (!found)
 | ||||
| +		xlog(D_AUTH, "denied access to %s", *dom == '$' ? dom+1 : dom);
 | ||||
|  out: | ||||
|  	if (found_path) | ||||
|  		free(found_path); | ||||
| @@ -839,6 +827,7 @@ out:
 | ||||
|  	xlog(D_CALL, "nfsd_fh: found %p path %s", found, found ? found->e_path : NULL); | ||||
|  } | ||||
|   | ||||
| +#ifdef HAVE_JUNCTION_SUPPORT
 | ||||
|  static void write_fsloc(char **bp, int *blen, struct exportent *ep) | ||||
|  { | ||||
|  	struct servers *servers; | ||||
| @@ -861,7 +850,7 @@ static void write_fsloc(char **bp, int *blen, struct exportent *ep)
 | ||||
|  	qword_addint(bp, blen, servers->h_referral); | ||||
|  	release_replicas(servers); | ||||
|  } | ||||
| -
 | ||||
| +#endif
 | ||||
|  static void write_secinfo(char **bp, int *blen, struct exportent *ep, int flag_mask) | ||||
|  { | ||||
|  	struct sec_entry *p; | ||||
| @@ -890,7 +879,7 @@ static int dump_to_cache(int f, char *buf, int buflen, char *domain,
 | ||||
|  	time_t now = time(0); | ||||
|   | ||||
|  	if (ttl <= 1) | ||||
| -		ttl = DEFAULT_TTL;
 | ||||
| +		ttl = default_ttl;
 | ||||
|   | ||||
|  	qword_add(&bp, &blen, domain); | ||||
|  	qword_add(&bp, &blen, path); | ||||
| @@ -903,7 +892,10 @@ static int dump_to_cache(int f, char *buf, int buflen, char *domain,
 | ||||
|  		qword_addint(&bp, &blen, exp->e_anonuid); | ||||
|  		qword_addint(&bp, &blen, exp->e_anongid); | ||||
|  		qword_addint(&bp, &blen, exp->e_fsid); | ||||
| +
 | ||||
| +#ifdef HAVE_JUNCTION_SUPPORT
 | ||||
|  		write_fsloc(&bp, &blen, exp); | ||||
| +#endif
 | ||||
|  		write_secinfo(&bp, &blen, exp, flag_mask); | ||||
|  		if (exp->e_uuid == NULL || different_fs) { | ||||
|  			char u[16]; | ||||
| @@ -917,8 +909,13 @@ static int dump_to_cache(int f, char *buf, int buflen, char *domain,
 | ||||
|  			qword_add(&bp, &blen, "uuid"); | ||||
|  			qword_addhex(&bp, &blen, u, 16); | ||||
|  		} | ||||
| -	} else
 | ||||
| +		xlog(D_AUTH, "granted access to %s for %s",
 | ||||
| +		     path, *domain == '$' ? domain+1 : domain);
 | ||||
| +	} else {
 | ||||
|  		qword_adduint(&bp, &blen, now + ttl); | ||||
| +		xlog(D_AUTH, "denied access to %s for %s",
 | ||||
| +		     path, *domain == '$' ? domain+1 : domain);
 | ||||
| +	}
 | ||||
|  	qword_addeol(&bp, &blen); | ||||
|  	if (blen <= 0) return -1; | ||||
|  	if (write(f, buf, bp - buf) != bp - buf) return -1; | ||||
| @@ -1421,6 +1418,40 @@ int cache_process_req(fd_set *readfds)
 | ||||
|  	return cnt; | ||||
|  } | ||||
|   | ||||
| +/**
 | ||||
| + * cache_process_loop - process incoming upcalls
 | ||||
| + */
 | ||||
| +void cache_process_loop(void)
 | ||||
| +{
 | ||||
| +	fd_set	readfds;
 | ||||
| +	int	selret;
 | ||||
| +
 | ||||
| +	FD_ZERO(&readfds);
 | ||||
| +
 | ||||
| +	for (;;) {
 | ||||
| +
 | ||||
| +		cache_set_fds(&readfds);
 | ||||
| +		v4clients_set_fds(&readfds);
 | ||||
| +
 | ||||
| +		selret = select(FD_SETSIZE, &readfds,
 | ||||
| +				(void *) 0, (void *) 0, (struct timeval *) 0);
 | ||||
| +
 | ||||
| +
 | ||||
| +		switch (selret) {
 | ||||
| +		case -1:
 | ||||
| +			if (errno == EINTR || errno == ECONNREFUSED
 | ||||
| +			 || errno == ENETUNREACH || errno == EHOSTUNREACH)
 | ||||
| +				continue;
 | ||||
| +			xlog(L_ERROR, "my_svc_run() - select: %m");
 | ||||
| +			return;
 | ||||
| +
 | ||||
| +		default:
 | ||||
| +			cache_process_req(&readfds);
 | ||||
| +			v4clients_process(&readfds);
 | ||||
| +		}
 | ||||
| +	}
 | ||||
| +}
 | ||||
| +
 | ||||
|   | ||||
|  /* | ||||
|   * Give IP->domain and domain+path->options to kernel | ||||
| diff --git a/support/export/export.h b/support/export/export.h
 | ||||
| new file mode 100644 | ||||
| index 00000000..8d5a0d30
 | ||||
| --- /dev/null
 | ||||
| +++ b/support/export/export.h
 | ||||
| @@ -0,0 +1,41 @@
 | ||||
| +/*
 | ||||
| + * Copyright (C) 2021 Red Hat <nfs@redhat.com>
 | ||||
| + *
 | ||||
| + * support/export/export.h
 | ||||
| + *
 | ||||
| + * Declarations for export support
 | ||||
| + */
 | ||||
| +
 | ||||
| +#ifndef EXPORT_H
 | ||||
| +#define EXPORT_H
 | ||||
| +
 | ||||
| +#include "nfslib.h"
 | ||||
| +#include "exportfs.h"
 | ||||
| +
 | ||||
| +unsigned int	auth_reload(void);
 | ||||
| +nfs_export *	auth_authenticate(const char *what,
 | ||||
| +					const struct sockaddr *caller,
 | ||||
| +					const char *path);
 | ||||
| +
 | ||||
| +void		cache_open(void);
 | ||||
| +void		cache_set_fds(fd_set *fdset);
 | ||||
| +int		cache_process_req(fd_set *readfds);
 | ||||
| +void		cache_process_loop(void);
 | ||||
| +
 | ||||
| +void		v4clients_init(void);
 | ||||
| +void		v4clients_set_fds(fd_set *fdset);
 | ||||
| +int		v4clients_process(fd_set *fdset);
 | ||||
| +
 | ||||
| +struct nfs_fh_len *
 | ||||
| +		cache_get_filehandle(nfs_export *exp, int len, char *p);
 | ||||
| +int		cache_export(nfs_export *exp, char *path);
 | ||||
| +
 | ||||
| +bool ipaddr_client_matches(nfs_export *exp, struct addrinfo *ai);
 | ||||
| +bool namelist_client_matches(nfs_export *exp, char *dom);
 | ||||
| +bool client_matches(nfs_export *exp, char *dom, struct addrinfo *ai);
 | ||||
| +
 | ||||
| +static inline bool is_ipaddr_client(char *dom)
 | ||||
| +{
 | ||||
| +	return dom[0] == '$';
 | ||||
| +}
 | ||||
| +#endif /* EXPORT__H */
 | ||||
| diff --git a/support/export/v4clients.c b/support/export/v4clients.c
 | ||||
| new file mode 100644 | ||||
| index 00000000..dd985463
 | ||||
| --- /dev/null
 | ||||
| +++ b/support/export/v4clients.c
 | ||||
| @@ -0,0 +1,227 @@
 | ||||
| +/*
 | ||||
| + * support/export/v4clients.c
 | ||||
| + *
 | ||||
| + * Montior clients appearing in, and disappearing from, /proc/fs/nfsd/clients
 | ||||
| + * and log relevant information.
 | ||||
| + */
 | ||||
| +
 | ||||
| +#include <unistd.h>
 | ||||
| +#include <stdlib.h>
 | ||||
| +#include <sys/inotify.h>
 | ||||
| +#include <errno.h>
 | ||||
| +#include "export.h"
 | ||||
| +
 | ||||
| +/* search.h declares 'struct entry' and nfs_prot.h
 | ||||
| + * does too.  Easiest fix is to trick search.h into
 | ||||
| + * calling its struct "struct Entry".
 | ||||
| + */
 | ||||
| +#define entry Entry
 | ||||
| +#include <search.h>
 | ||||
| +#undef entry
 | ||||
| +
 | ||||
| +static int clients_fd = -1;
 | ||||
| +
 | ||||
| +void v4clients_init(void)
 | ||||
| +{
 | ||||
| +	if (clients_fd >= 0)
 | ||||
| +		return;
 | ||||
| +	clients_fd = inotify_init1(IN_NONBLOCK);
 | ||||
| +	if (clients_fd < 0) {
 | ||||
| +		xlog_err("Unable to initialise v4clients watcher: %s\n",
 | ||||
| +			 strerror(errno));
 | ||||
| +		return;
 | ||||
| +	}
 | ||||
| +	if (inotify_add_watch(clients_fd, "/proc/fs/nfsd/clients",
 | ||||
| +			      IN_CREATE | IN_DELETE) < 0) {
 | ||||
| +		xlog_err("Unable to watch /proc/fs/nfsd/clients: %s\n",
 | ||||
| +			 strerror(errno));
 | ||||
| +		close(clients_fd);
 | ||||
| +		clients_fd = -1;
 | ||||
| +		return;
 | ||||
| +	}
 | ||||
| +}
 | ||||
| +
 | ||||
| +void v4clients_set_fds(fd_set *fdset)
 | ||||
| +{
 | ||||
| +	if (clients_fd >= 0)
 | ||||
| +		FD_SET(clients_fd, fdset);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void *tree_root;
 | ||||
| +static int have_unconfirmed;
 | ||||
| +
 | ||||
| +struct ent {
 | ||||
| +	unsigned long num;
 | ||||
| +	char *clientid;
 | ||||
| +	char *addr;
 | ||||
| +	int vers;
 | ||||
| +	int unconfirmed;
 | ||||
| +	int wid;
 | ||||
| +};
 | ||||
| +
 | ||||
| +static int ent_cmp(const void *av, const void *bv)
 | ||||
| +{
 | ||||
| +	const struct ent *a = av;
 | ||||
| +	const struct ent *b = bv;
 | ||||
| +
 | ||||
| +	if (a->num < b->num)
 | ||||
| +		return -1;
 | ||||
| +	if (a->num > b->num)
 | ||||
| +		return 1;
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void free_ent(struct ent *ent)
 | ||||
| +{
 | ||||
| +	free(ent->clientid);
 | ||||
| +	free(ent->addr);
 | ||||
| +	free(ent);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static char *dup_line(char *line)
 | ||||
| +{
 | ||||
| +	char *ret;
 | ||||
| +	char *e = strchr(line, '\n');
 | ||||
| +	if (!e)
 | ||||
| +		e = line + strlen(line);
 | ||||
| +	ret = malloc(e - line + 1);
 | ||||
| +	if (ret) {
 | ||||
| +		memcpy(ret, line, e - line);
 | ||||
| +		ret[e-line] = 0;
 | ||||
| +	}
 | ||||
| +	return ret;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void read_info(struct ent *key)
 | ||||
| +{
 | ||||
| +	char buf[2048];
 | ||||
| +	char *path;
 | ||||
| +	int was_unconfirmed = key->unconfirmed;
 | ||||
| +	FILE *f;
 | ||||
| +
 | ||||
| +	if (asprintf(&path, "/proc/fs/nfsd/clients/%lu/info", key->num) < 0)
 | ||||
| +		return;
 | ||||
| +
 | ||||
| +	f = fopen(path, "r");
 | ||||
| +	if (!f) {
 | ||||
| +		free(path);
 | ||||
| +		return;
 | ||||
| +	}
 | ||||
| +	if (key->wid < 0)
 | ||||
| +		key->wid = inotify_add_watch(clients_fd, path, IN_MODIFY);
 | ||||
| +
 | ||||
| +	while (fgets(buf, sizeof(buf), f)) {
 | ||||
| +		if (strncmp(buf, "clientid: ", 10) == 0) {
 | ||||
| +			free(key->clientid);
 | ||||
| +			key->clientid = dup_line(buf+10);
 | ||||
| +		}
 | ||||
| +		if (strncmp(buf, "address: ", 9) == 0) {
 | ||||
| +			free(key->addr);
 | ||||
| +			key->addr = dup_line(buf+9);
 | ||||
| +		}
 | ||||
| +		if (strncmp(buf, "minor version: ", 15) == 0)
 | ||||
| +			key->vers = atoi(buf+15);
 | ||||
| +		if (strncmp(buf, "status: ", 8) == 0 &&
 | ||||
| +		    strstr(buf, " unconfirmed") != NULL) {
 | ||||
| +			key->unconfirmed = 1;
 | ||||
| +			have_unconfirmed = 1;
 | ||||
| +		}
 | ||||
| +		if (strncmp(buf, "status: ", 8) == 0 &&
 | ||||
| +		    strstr(buf, " confirmed") != NULL)
 | ||||
| +			key->unconfirmed = 0;
 | ||||
| +	}
 | ||||
| +	fclose(f);
 | ||||
| +	free(path);
 | ||||
| +
 | ||||
| +	if (was_unconfirmed && !key->unconfirmed)
 | ||||
| +		xlog(L_NOTICE, "v4.%d client attached: %s from %s",
 | ||||
| +		     key->vers, key->clientid ?: "-none-",
 | ||||
| +		     key->addr ?: "-none-");
 | ||||
| +	if (!key->unconfirmed && key->wid >= 0) {
 | ||||
| +		inotify_rm_watch(clients_fd, key->wid);
 | ||||
| +		key->wid = -1;
 | ||||
| +	}
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void add_id(int id)
 | ||||
| +{
 | ||||
| +	struct ent **ent;
 | ||||
| +	struct ent *key;
 | ||||
| +
 | ||||
| +	key = calloc(1, sizeof(*key));
 | ||||
| +	if (!key) {
 | ||||
| +		return;
 | ||||
| +	}
 | ||||
| +	key->num = id;
 | ||||
| +	key->wid = -1;
 | ||||
| +
 | ||||
| +	ent = tsearch(key, &tree_root, ent_cmp);
 | ||||
| +
 | ||||
| +	if (!ent || *ent != key)
 | ||||
| +		/* Already existed, or insertion failed */
 | ||||
| +		free_ent(key);
 | ||||
| +	else
 | ||||
| +		read_info(key);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void del_id(unsigned long id)
 | ||||
| +{
 | ||||
| +	struct ent key = {.num = id};
 | ||||
| +	struct ent **e, *ent;
 | ||||
| +
 | ||||
| +	e = tfind(&key, &tree_root, ent_cmp);
 | ||||
| +	if (!e || !*e)
 | ||||
| +		return;
 | ||||
| +	ent = *e;
 | ||||
| +	tdelete(ent, &tree_root, ent_cmp);
 | ||||
| +	if (!ent->unconfirmed)
 | ||||
| +		xlog(L_NOTICE, "v4.%d client detached: %s from %s",
 | ||||
| +		     ent->vers, ent->clientid, ent->addr);
 | ||||
| +	if (ent->wid >= 0)
 | ||||
| +		inotify_rm_watch(clients_fd, ent->wid);
 | ||||
| +	free_ent(ent);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void check_id(unsigned long id)
 | ||||
| +{
 | ||||
| +	struct ent key = {.num = id};
 | ||||
| +	struct ent **e, *ent;
 | ||||
| +
 | ||||
| +	e = tfind(&key, &tree_root, ent_cmp);
 | ||||
| +	if (!e || !*e)
 | ||||
| +		return;
 | ||||
| +	ent = *e;
 | ||||
| +	if (ent->unconfirmed)
 | ||||
| +		read_info(ent);
 | ||||
| +}
 | ||||
| +
 | ||||
| +int v4clients_process(fd_set *fdset)
 | ||||
| +{
 | ||||
| +	char buf[4096] __attribute__((aligned(__alignof__(struct inotify_event))));
 | ||||
| +	const struct inotify_event *ev;
 | ||||
| +	ssize_t len;
 | ||||
| +	char *ptr;
 | ||||
| +
 | ||||
| +	if (clients_fd < 0 ||
 | ||||
| +	    !FD_ISSET(clients_fd, fdset))
 | ||||
| +		return 0;
 | ||||
| +
 | ||||
| +	while ((len = read(clients_fd, buf, sizeof(buf))) > 0) {
 | ||||
| +		for (ptr = buf; ptr < buf + len;
 | ||||
| +		     ptr += sizeof(struct inotify_event) + ev->len) {
 | ||||
| +			int id;
 | ||||
| +			ev = (const struct inotify_event *)ptr;
 | ||||
| +
 | ||||
| +			id = atoi(ev->name);
 | ||||
| +			if (id <= 0)
 | ||||
| +				continue;
 | ||||
| +			if (ev->mask & IN_CREATE)
 | ||||
| +				add_id(id);
 | ||||
| +			if (ev->mask & IN_DELETE)
 | ||||
| +				del_id(id);
 | ||||
| +			if (ev->mask & IN_MODIFY)
 | ||||
| +				check_id(id);
 | ||||
| +		}
 | ||||
| +	}
 | ||||
| +	return 1;
 | ||||
| +}
 | ||||
| diff --git a/utils/mountd/v4root.c b/support/export/v4root.c
 | ||||
| similarity index 99% | ||||
| rename from utils/mountd/v4root.c | ||||
| rename to support/export/v4root.c | ||||
| index 8ec33fb0..4d33117f 100644
 | ||||
| --- a/utils/mountd/v4root.c
 | ||||
| +++ b/support/export/v4root.c
 | ||||
| @@ -47,7 +47,7 @@ static nfs_export pseudo_root = {
 | ||||
|  		.e_nsqgids = 0, | ||||
|  		.e_fsid = 0, | ||||
|  		.e_mountpoint = NULL, | ||||
| -		.e_ttl = DEFAULT_TTL,
 | ||||
| +		.e_ttl = 0,
 | ||||
|  	}, | ||||
|  	.m_exported = 0, | ||||
|  	.m_xtabent = 1, | ||||
| @@ -86,6 +86,7 @@ v4root_create(char *path, nfs_export *export)
 | ||||
|  	struct exportent *curexp = &export->m_export; | ||||
|   | ||||
|  	dupexportent(&eep, &pseudo_root.m_export); | ||||
| +	eep.e_ttl = default_ttl;
 | ||||
|  	eep.e_hostname = curexp->e_hostname; | ||||
|  	strncpy(eep.e_path, path, sizeof(eep.e_path)-1); | ||||
|  	if (strcmp(path, "/") != 0) | ||||
| diff --git a/support/include/exportfs.h b/support/include/exportfs.h
 | ||||
| index 4e0d9d13..bfae1957 100644
 | ||||
| --- a/support/include/exportfs.h
 | ||||
| +++ b/support/include/exportfs.h
 | ||||
| @@ -105,7 +105,8 @@ typedef struct mexport {
 | ||||
|  } nfs_export; | ||||
|   | ||||
|  #define HASH_TABLE_SIZE 1021 | ||||
| -#define DEFAULT_TTL	(30 * 60)
 | ||||
| +
 | ||||
| +extern int default_ttl;
 | ||||
|   | ||||
|  typedef struct _exp_hash_entry { | ||||
|  	nfs_export * p_first; | ||||
| diff --git a/support/nfs/exports.c b/support/nfs/exports.c
 | ||||
| index a7582cae..4dd2e5d3 100644
 | ||||
| --- a/support/nfs/exports.c
 | ||||
| +++ b/support/nfs/exports.c
 | ||||
| @@ -47,6 +47,8 @@ struct flav_info flav_map[] = {
 | ||||
|   | ||||
|  const int flav_map_size = sizeof(flav_map)/sizeof(flav_map[0]); | ||||
|   | ||||
| +int default_ttl = 30 * 60;
 | ||||
| +
 | ||||
|  static char	*efname = NULL; | ||||
|  static XFILE	*efp = NULL; | ||||
|  static int	first; | ||||
| @@ -100,7 +102,7 @@ static void init_exportent (struct exportent *ee, int fromkernel)
 | ||||
|  	ee->e_nsquids = 0; | ||||
|  	ee->e_nsqgids = 0; | ||||
|  	ee->e_uuid = NULL; | ||||
| -	ee->e_ttl = DEFAULT_TTL;
 | ||||
| +	ee->e_ttl = default_ttl;
 | ||||
|  } | ||||
|   | ||||
|  struct exportent * | ||||
| diff --git a/systemd/nfs.conf.man b/systemd/nfs.conf.man
 | ||||
| index 498d93a9..aa4630bb 100644
 | ||||
| --- a/systemd/nfs.conf.man
 | ||||
| +++ b/systemd/nfs.conf.man
 | ||||
| @@ -157,6 +157,8 @@ Recognized values:
 | ||||
|  .BR port , | ||||
|  .BR threads , | ||||
|  .BR reverse-lookup , | ||||
| +.BR cache-use-upaddr ,
 | ||||
| +.BR ttl ,
 | ||||
|  .BR state-directory-path , | ||||
|  .BR ha-callout . | ||||
|   | ||||
| @@ -166,6 +168,14 @@ section, are used to configure mountd.  See
 | ||||
|  .BR rpc.mountd (8) | ||||
|  for details. | ||||
|   | ||||
| +Note that setting 
 | ||||
| +.B "\[dq]debug = auth\[dq]"
 | ||||
| +for
 | ||||
| +.B mountd
 | ||||
| +is equivalent to providing the
 | ||||
| +.B \-\-log\-auth
 | ||||
| +option.
 | ||||
| +
 | ||||
|  The | ||||
|  .B state-directory-path | ||||
|  value in the | ||||
| diff --git a/utils/mountd/Makefile.am b/utils/mountd/Makefile.am
 | ||||
| index 73eeb3f3..c41f06de 100644
 | ||||
| --- a/utils/mountd/Makefile.am
 | ||||
| +++ b/utils/mountd/Makefile.am
 | ||||
| @@ -13,8 +13,8 @@ KPREFIX		= @kprefix@
 | ||||
|  sbin_PROGRAMS	= mountd | ||||
|   | ||||
|  noinst_HEADERS = fsloc.h | ||||
| -mountd_SOURCES = mountd.c mount_dispatch.c auth.c rmtab.c cache.c \
 | ||||
| -		 svc_run.c fsloc.c v4root.c mountd.h
 | ||||
| +mountd_SOURCES = mountd.c mount_dispatch.c rmtab.c \
 | ||||
| +		 svc_run.c fsloc.c mountd.h
 | ||||
|  mountd_LDADD = ../../support/export/libexport.a \ | ||||
|  	       ../../support/nfs/libnfs.la \ | ||||
|  	       ../../support/misc/libmisc.a \ | ||||
| diff --git a/utils/mountd/mountd.c b/utils/mountd/mountd.c
 | ||||
| index 0b891121..2b342377 100644
 | ||||
| --- a/utils/mountd/mountd.c
 | ||||
| +++ b/utils/mountd/mountd.c
 | ||||
| @@ -30,6 +30,7 @@
 | ||||
|  #include "rpcmisc.h" | ||||
|  #include "pseudoflavors.h" | ||||
|  #include "nfslib.h" | ||||
| +#include "export.h"
 | ||||
|   | ||||
|  extern void my_svc_run(void); | ||||
|   | ||||
| @@ -73,8 +74,12 @@ static struct option longopts[] =
 | ||||
|  	{ "reverse-lookup", 0, 0, 'r' }, | ||||
|  	{ "manage-gids", 0, 0, 'g' }, | ||||
|  	{ "no-udp", 0, 0, 'u' }, | ||||
| +	{ "log-auth", 0, 0, 'l'},
 | ||||
| +	{ "cache-use-ipaddr", 0, 0, 'i'},
 | ||||
| +	{ "ttl", 1, 0, 'T'},
 | ||||
|  	{ NULL, 0, 0, 0 } | ||||
|  }; | ||||
| +static char shortopts[] = "o:nFd:p:P:hH:N:V:vurs:t:gliT:";
 | ||||
|   | ||||
|  #define NFSVERSBIT(vers)	(0x1 << (vers - 1)) | ||||
|  #define NFSVERSBIT_ALL		(NFSVERSBIT(2) | NFSVERSBIT(3) | NFSVERSBIT(4)) | ||||
| @@ -669,6 +674,7 @@ main(int argc, char **argv)
 | ||||
|  	int	port = 0; | ||||
|  	int	descriptors = 0; | ||||
|  	int	c; | ||||
| +	int	ttl;
 | ||||
|  	int	vers; | ||||
|  	struct sigaction sa; | ||||
|  	struct rlimit rlim; | ||||
| @@ -687,6 +693,8 @@ main(int argc, char **argv)
 | ||||
|  	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"); | ||||
| +	if (conf_get_bool("mountd", "cache-use-ipaddr", 0))
 | ||||
| +		use_ipaddr = 2;
 | ||||
|   | ||||
|  	s = conf_get_str("mountd", "state-directory-path"); | ||||
|  	if (s && !state_setup_basedir(argv[0], s)) | ||||
| @@ -710,10 +718,13 @@ main(int argc, char **argv)
 | ||||
|  			NFSCTL_VERUNSET(nfs_version, vers); | ||||
|  	} | ||||
|   | ||||
| +	ttl = conf_get_num("mountd", "ttl", default_ttl);
 | ||||
| +	if (ttl > 0)
 | ||||
| +		default_ttl = ttl;
 | ||||
|   | ||||
|  	/* Parse the command line options and arguments. */ | ||||
|  	opterr = 0; | ||||
| -	while ((c = getopt_long(argc, argv, "o:nFd:p:P:hH:N:V:vurs:t:g", longopts, NULL)) != EOF)
 | ||||
| +	while ((c = getopt_long(argc, argv, shortopts, longopts, NULL)) != EOF)
 | ||||
|  		switch (c) { | ||||
|  		case 'g': | ||||
|  			manage_gids = 1; | ||||
| @@ -784,6 +795,21 @@ main(int argc, char **argv)
 | ||||
|  		case 'u': | ||||
|  			NFSCTL_UDPUNSET(_rpcprotobits); | ||||
|  			break; | ||||
| +		case 'l':
 | ||||
| +			xlog_sconfig("auth", 1);
 | ||||
| +			break;
 | ||||
| +		case 'i':
 | ||||
| +			use_ipaddr = 2;
 | ||||
| +			break;
 | ||||
| +		case 'T':
 | ||||
| +			ttl = atoi(optarg);
 | ||||
| +			if (ttl <= 0) {
 | ||||
| +				fprintf(stderr, "%s: bad ttl number of seconds: %s\n",
 | ||||
| +					argv[0], optarg);
 | ||||
| +				usage(argv[0], 1);
 | ||||
| +			}
 | ||||
| +			default_ttl = ttl;
 | ||||
| +			break;
 | ||||
|  		case 0: | ||||
|  			break; | ||||
|  		case '?': | ||||
| @@ -888,6 +914,8 @@ main(int argc, char **argv)
 | ||||
|  	if (num_threads > 1) | ||||
|  		fork_workers(); | ||||
|   | ||||
| +	v4clients_init();
 | ||||
| +
 | ||||
|  	xlog(L_NOTICE, "Version " VERSION " starting"); | ||||
|  	my_svc_run(); | ||||
|   | ||||
| @@ -903,6 +931,7 @@ usage(const char *prog, int n)
 | ||||
|  { | ||||
|  	fprintf(stderr, | ||||
|  "Usage: %s [-F|--foreground] [-h|--help] [-v|--version] [-d kind|--debug kind]\n" | ||||
| +"	[-l|--log-auth] [-i|--cache-use-ipaddr] [-T|--ttl ttl]\n"
 | ||||
|  "	[-o num|--descriptors num]\n" | ||||
|  "	[-p|--port port] [-V version|--nfs-version version]\n" | ||||
|  "	[-N version|--no-nfs-version version] [-n|--no-tcp]\n" | ||||
| diff --git a/utils/mountd/mountd.h b/utils/mountd/mountd.h
 | ||||
| index f058f01d..d3077531 100644
 | ||||
| --- a/utils/mountd/mountd.h
 | ||||
| +++ b/utils/mountd/mountd.h
 | ||||
| @@ -60,9 +60,4 @@ bool ipaddr_client_matches(nfs_export *exp, struct addrinfo *ai);
 | ||||
|  bool namelist_client_matches(nfs_export *exp, char *dom); | ||||
|  bool client_matches(nfs_export *exp, char *dom, struct addrinfo *ai); | ||||
|   | ||||
| -static inline bool is_ipaddr_client(char *dom)
 | ||||
| -{
 | ||||
| -	return dom[0] == '$';
 | ||||
| -}
 | ||||
| -
 | ||||
|  #endif /* MOUNTD_H */ | ||||
| diff --git a/utils/mountd/mountd.man b/utils/mountd/mountd.man
 | ||||
| index 8a7943f8..2a91e193 100644
 | ||||
| --- a/utils/mountd/mountd.man
 | ||||
| +++ b/utils/mountd/mountd.man
 | ||||
| @@ -13,24 +13,24 @@ The
 | ||||
|  .B rpc.mountd | ||||
|  daemon implements the server side of the NFS MOUNT protocol, | ||||
|  an NFS side protocol used by NFS version 2 [RFC1094] and NFS version 3 [RFC1813]. | ||||
| +It also responds to requests from the Linux kernel to authenticate
 | ||||
| +clients and provides details of access permissions.
 | ||||
|  .PP | ||||
| -An NFS server maintains a table of local physical file systems
 | ||||
| -that are accessible to NFS clients.
 | ||||
| -Each file system in this table is referred to as an
 | ||||
| -.IR "exported file system" ,
 | ||||
| -or
 | ||||
| -.IR export ,
 | ||||
| -for short.
 | ||||
| -.PP
 | ||||
| -Each file system in the export table has an access control list.
 | ||||
| -.B rpc.mountd
 | ||||
| -uses these access control lists to determine
 | ||||
| -whether an NFS client is permitted to access a given file system.
 | ||||
| -For details on how to manage your NFS server's export table, see the
 | ||||
| -.BR exports (5)
 | ||||
| -and
 | ||||
| -.BR exportfs (8)
 | ||||
| -man pages.
 | ||||
| +The NFS server
 | ||||
| +.RI ( nfsd )
 | ||||
| +maintains a cache of authentication and authorization information which
 | ||||
| +is used to identify the source of each request, and then what access
 | ||||
| +permissions that source has to any local filesystem.  When required
 | ||||
| +information is not found in the cache, the server sends a request to
 | ||||
| +.B mountd
 | ||||
| +to fill in the missing information.  Mountd uses a table of information
 | ||||
| +stored in
 | ||||
| +.B /var/lib/nfs/etab
 | ||||
| +and maintained by
 | ||||
| +.BR exportfs (8),
 | ||||
| +possibly based on the contents of 
 | ||||
| +.BR exports (5),
 | ||||
| +to respond to each request.
 | ||||
|  .SS Mounting exported NFS File Systems | ||||
|  The NFS MOUNT protocol has several procedures. | ||||
|  The most important of these are | ||||
| @@ -78,11 +78,69 @@ A client may continue accessing an export even after invoking UMNT.
 | ||||
|  If the client reboots without sending a UMNT request, stale entries | ||||
|  remain for that client in | ||||
|  .IR /var/lib/nfs/rmtab . | ||||
| +.SS Mounting File Systems with NFSv4
 | ||||
| +Version 4 (and later) of NFS does not use a separate NFS MOUNT
 | ||||
| +protocol.  Instead mounting is performed using regular NFS requests
 | ||||
| +handled by the NFS server in the Linux kernel
 | ||||
| +.RI ( nfsd ).
 | ||||
| +Consequently
 | ||||
| +.I /var/lib/nfs/rmtab
 | ||||
| +is not updated to reflect any NFSv4 activity.
 | ||||
|  .SH OPTIONS | ||||
|  .TP | ||||
|  .B \-d kind " or " \-\-debug kind | ||||
|  Turn on debugging. Valid kinds are: all, auth, call, general and parse. | ||||
|  .TP | ||||
| +.BR \-l " or " \-\-log\-auth
 | ||||
| +Enable logging of responses to authentication and access requests from
 | ||||
| +nfsd.  Each response is then cached by the kernel for 30 minutes (or as set by
 | ||||
| +.B \-\-ttl
 | ||||
| +below), and will be refreshed after 15 minutes (half the ttl time) if
 | ||||
| +the relevant client remains active.
 | ||||
| +Note that
 | ||||
| +.B -l
 | ||||
| +is equivalent to
 | ||||
| +.B "-d auth"
 | ||||
| +and so can be enabled in
 | ||||
| +.B /etc/nfs.conf
 | ||||
| +with
 | ||||
| +.B "\[dq]debug = auth\[dq]"
 | ||||
| +in the
 | ||||
| +.B "[mountd]"
 | ||||
| +section.
 | ||||
| +.IP
 | ||||
| +.B rpc.mountd
 | ||||
| +will always log authentication responses to MOUNT requests when NFSv3 is
 | ||||
| +used, but to get similar logs for NFSv4, this option is required.
 | ||||
| +.TP
 | ||||
| +.BR \-i " or " \-\-cache\-use\-ipaddr
 | ||||
| +Normally each client IP address is matched against each host identifier
 | ||||
| +(name, wildcard, netgroup etc) found in
 | ||||
| +.B /etc/exports
 | ||||
| +and a combined identity is formed from all matching identifiers.
 | ||||
| +Often many clients will map to the same combined identity so performing
 | ||||
| +this mapping reduces the number of distinct access details that the
 | ||||
| +kernel needs to store.
 | ||||
| +Specifying the
 | ||||
| +.B \-i
 | ||||
| +option suppresses this mapping so that access to each filesystem is
 | ||||
| +requested and cached separately for each client IP address.  Doing this
 | ||||
| +can increase the burden of updating the cache slightly, but can make the
 | ||||
| +log messages produced by the
 | ||||
| +.B -l
 | ||||
| +option easier to read.
 | ||||
| +.TP
 | ||||
| +.B \-T " or " \-\-ttl
 | ||||
| +Provide a time-to-live (TTL) for cached information given to the kernel.
 | ||||
| +The kernel will normally request an update if the information is needed
 | ||||
| +after half of this time has expired.  Increasing the provided number,
 | ||||
| +which is in seconds, reduces the rate of cache update requests, and this
 | ||||
| +is particularly noticeable when these requests are logged with
 | ||||
| +.BR \-l .
 | ||||
| +However increasing also means that changes to hostname to address
 | ||||
| +mappings can take longer to be noticed.
 | ||||
| +The default TTL is 1800 (30 minutes).
 | ||||
| +.TP
 | ||||
|  .B \-F " or " \-\-foreground | ||||
|  Run in foreground (do not daemonize) | ||||
|  .TP | ||||
| @@ -213,9 +271,11 @@ Values recognized in the
 | ||||
|  .B [mountd] | ||||
|  section include | ||||
|  .BR manage-gids , | ||||
| +.BR cache\-use\-ipaddr ,
 | ||||
|  .BR descriptors , | ||||
|  .BR port , | ||||
|  .BR threads , | ||||
| +.BR ttl ,
 | ||||
|  .BR reverse-lookup ", and" | ||||
|  .BR state-directory-path , | ||||
|  .B ha-callout | ||||
| @@ -265,5 +325,9 @@ table of clients accessing server's exports
 | ||||
|  RFC 1094 - "NFS: Network File System Protocol Specification" | ||||
|  .br | ||||
|  RFC 1813 - "NFS Version 3 Protocol Specification" | ||||
| +.br
 | ||||
| +RFC 7530 - "Network File System (NFS) Version 4 Protocol"
 | ||||
| +.br
 | ||||
| +RFC 8881 - "Network File System (NFS) Version 4 Minor Version 1 Protocol"
 | ||||
|  .SH AUTHOR | ||||
|  Olaf Kirch, H. J. Lu, G. Allan Morris III, and a host of others. | ||||
| diff --git a/utils/mountd/svc_run.c b/utils/mountd/svc_run.c
 | ||||
| index 41b96d7f..167b9757 100644
 | ||||
| --- a/utils/mountd/svc_run.c
 | ||||
| +++ b/utils/mountd/svc_run.c
 | ||||
| @@ -56,10 +56,9 @@
 | ||||
|  #ifdef HAVE_LIBTIRPC | ||||
|  #include <rpc/rpc_com.h> | ||||
|  #endif | ||||
| +#include "export.h"
 | ||||
|   | ||||
|  void my_svc_run(void); | ||||
| -void cache_set_fds(fd_set *fdset);
 | ||||
| -int cache_process_req(fd_set *readfds);
 | ||||
|   | ||||
|  #if defined(__GLIBC__) && LONG_MAX != INT_MAX | ||||
|  /* bug in glibc 2.3.6 and earlier, we need | ||||
| @@ -101,6 +100,7 @@ my_svc_run(void)
 | ||||
|   | ||||
|  		readfds = svc_fdset; | ||||
|  		cache_set_fds(&readfds); | ||||
| +		v4clients_set_fds(&readfds);
 | ||||
|   | ||||
|  		selret = select(FD_SETSIZE, &readfds, | ||||
|  				(void *) 0, (void *) 0, (struct timeval *) 0); | ||||
| @@ -116,6 +116,7 @@ my_svc_run(void)
 | ||||
|   | ||||
|  		default: | ||||
|  			selret -= cache_process_req(&readfds); | ||||
| +			selret -= v4clients_process(&readfds);
 | ||||
|  			if (selret) | ||||
|  				svc_getreqset(&readfds); | ||||
|  		} | ||||
							
								
								
									
										27
									
								
								SOURCES/nfs-utils-2.3.3-nfsidmap-debug.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								SOURCES/nfs-utils-2.3.3-nfsidmap-debug.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | ||||
| commit 0095435db8228d5a88ec35a63cb64271e2e648a8 | ||||
| Author: Steve Dickson <steved@redhat.com> | ||||
| Date:   Thu Dec 19 12:48:31 2019 -0500 | ||||
| 
 | ||||
|     libnfsidmap: Turn off default verbosity | ||||
|      | ||||
|     Commit f080188e changed the library's verbosity | ||||
|     to be on by default. The patch turns it off by | ||||
|     default | ||||
|      | ||||
|     Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1774787 | ||||
|      | ||||
|     Signed-off-by: Steve Dickson <steved@redhat.com> | ||||
| 
 | ||||
| diff --git a/support/nfsidmap/libnfsidmap.c b/support/nfsidmap/libnfsidmap.c
 | ||||
| index 9299e652..d11710f1 100644
 | ||||
| --- a/support/nfsidmap/libnfsidmap.c
 | ||||
| +++ b/support/nfsidmap/libnfsidmap.c
 | ||||
| @@ -101,7 +101,7 @@ static void default_logger(const char *fmt, ...)
 | ||||
|   | ||||
|  #pragma GCC visibility pop | ||||
|  nfs4_idmap_log_function_t idmap_log_func = default_logger; | ||||
| -int idmap_verbosity = 2;
 | ||||
| +int idmap_verbosity = 0;
 | ||||
|  #pragma GCC visibility push(hidden) | ||||
|   | ||||
|  static int id_as_chars(char *name, uid_t *id) | ||||
| @ -2,7 +2,7 @@ Summary: NFS utilities and supporting clients and daemons for the kernel NFS ser | ||||
| Name: nfs-utils | ||||
| URL: http://linux-nfs.org/ | ||||
| Version: 2.3.3 | ||||
| Release: 46%{?dist} | ||||
| Release: 51%{?dist} | ||||
| Epoch: 1 | ||||
| 
 | ||||
| # group all 32bit related archs | ||||
| @ -85,6 +85,12 @@ Patch043: nfs-utils-2.3.3-gssd-timeout-thread.patch | ||||
| Patch044: nfs-utils-2.3.3-gssd-debug-cleanup.patch | ||||
| Patch045: nfs-utils-2.3.3-gssd-mutex-refcnt.patch | ||||
| 
 | ||||
| # | ||||
| # RHEL 8.6 | ||||
| Patch046: nfs-utils-2.3.3-mountd-v4-logging.patch | ||||
| Patch047: nfs-utils-2.3.3-gssd-printerr.patch | ||||
| Patch048: nfs-utils-2.3.3-mount-ebusy.patch | ||||
| Patch049: nfs-utils-2.3.3-nfsidmap-debug.patch | ||||
| 
 | ||||
| Patch100: nfs-utils-1.2.1-statdpath-man.patch | ||||
| Patch101: nfs-utils-1.2.1-exp-subtree-warn-off.patch | ||||
| @ -360,6 +366,21 @@ fi | ||||
| %{_libdir}/libnfsidmap.so | ||||
| 
 | ||||
| %changelog | ||||
| * Mon Mar  7 2022 Steve Dickson <steved@redhat.com> 2.3.3-51 | ||||
| - libnfsidmap: Turn off default verbosity (bz 2057612) | ||||
| 
 | ||||
| * Sat Feb 19 2022 Steve Dickson <steved@redhat.com> 2.3.3-50 | ||||
| - mount.nfs: Fix Typo auto negotiating code. (bz 1946346) | ||||
| 
 | ||||
| * Mon Feb 14 2022 Steve Dickson <steved@redhat.com> 2.3.3-49 | ||||
| - mount.nfs Fix error reporting for already mounted shares (bz 1946346) | ||||
| 
 | ||||
| * Thu Nov 4 2021 Steve Dickson <steved@redhat.com> 2.3.3-48 | ||||
| - gssd: fix crash in debug message (bz 1988283) | ||||
| 
 | ||||
| * Tue Nov 2 2021 Steve Dickson <steved@redhat.com> 2.3.3-47 | ||||
| - Enable logging for NFSv4 mount requests (bz 2004151) | ||||
| 
 | ||||
| * Wed Jul 28 2021 Steve Dickson <steved@redhat.com> 2.3.3-46 | ||||
| - mount.nfs: Fix the sloppy option processing (bz 1967883) | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user