steved pushed to nfs-utils (master). "Update to latest RC release: nfs-utils-1-3-3-rc4 (..more)"

notifications at fedoraproject.org notifications at fedoraproject.org
Thu May 7 14:23:14 UTC 2015


From 084cf0ad1a8ed944da93cae91887c4592f72062a Mon Sep 17 00:00:00 2001
From: Steve Dickson <steved at redhat.com>
Date: Thu, 7 May 2015 10:21:45 -0400
Subject: Update to latest RC release: nfs-utils-1-3-3-rc4

Signed-off-by: Steve Dickson <steved at redhat.com>

diff --git a/nfs-utils-1.3.3-rc1.patch b/nfs-utils-1.3.3-rc1.patch
deleted file mode 100644
index 363acf5..0000000
--- a/nfs-utils-1.3.3-rc1.patch
+++ /dev/null
@@ -1,182 +0,0 @@
-diff --git a/configure.ac b/configure.ac
-index 8e427e3..e61430f 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -60,7 +60,6 @@ AC_ARG_WITH(systemd,
- 	[AC_HELP_STRING([--with-systemd@<:@=unit-dir-path@:>@],
- 			[install systemd unit files @<:@Default: no, and path defaults to /usr/lib/systemd/system if not given@:>@])],
- 	test "$withval" = "no" && use_systemd=0 || unitdir=$withval use_systemd=1
--	use_systemd=0
- 	)
- 	AM_CONDITIONAL(INSTALL_SYSTEMD, [test "$use_systemd" = 1])
- 	AC_SUBST(unitdir)
-diff --git a/support/nfs/exports.c b/support/nfs/exports.c
-index eb782b9..4b17d3c 100644
---- a/support/nfs/exports.c
-+++ b/support/nfs/exports.c
-@@ -154,6 +154,7 @@ getexportent(int fromkernel, int fromexports)
- 		}
- 	}
- 
-+	xfree(ee.e_hostname);
- 	ee = def_ee;
- 
- 	/* Check for default client */
-@@ -176,7 +177,6 @@ getexportent(int fromkernel, int fromexports)
- 		if (!has_default_opts)
- 			xlog(L_WARNING, "No options for %s %s: suggest %s(sync) to avoid warning", ee.e_path, exp, exp);
- 	}
--	xfree(ee.e_hostname);
- 	ee.e_hostname = xstrdup(hostname);
- 
- 	if (parseopts(opt, &ee, fromexports && !has_default_subtree_opts, NULL) < 0)
-diff --git a/systemd/rpc-statd-notify.service b/systemd/rpc-statd-notify.service
-index 941afe5..a655445 100644
---- a/systemd/rpc-statd-notify.service
-+++ b/systemd/rpc-statd-notify.service
-@@ -1,7 +1,7 @@
- [Unit]
- Description=Notify NFS peers of a restart
- Requires=network-online.target
--After=network-online.target nss-lookup.target
-+After=network.target nss-lookup.target
- 
- # if we run an nfs server, it needs to be running before we
- # tell clients that it has restarted.
-diff --git a/tools/mountstats/mountstats.man b/tools/mountstats/mountstats.man
-index bee3f86..a9df1e4 100644
---- a/tools/mountstats/mountstats.man
-+++ b/tools/mountstats/mountstats.man
-@@ -10,7 +10,7 @@ mountstats \- Displays various NFS client per-mount statistics
- .RB [ \-v | \-\-version ]
- .RB [ \-f | \-\-file
- .IR infile ]
--.RB [ \-s | \-\-since
-+.RB [ \-S | \-\-since
- .IR sincefile ]
- .\" .RB [ \-n | \-\-nfs | \-r | \-\-rpc | \-R | \-\-raw ]
- .R [
-@@ -27,7 +27,7 @@ mountstats \- Displays various NFS client per-mount statistics
- .RB [ \-v | \-\-version ]
- .RB [ \-f | \-\-file
- .IR infile ]
--.RB [ \-s | \-\-since
-+.RB [ \-S | \-\-since
- .IR sincefile ]
- .RI [ interval ]
- .RI [ count ]
-@@ -38,7 +38,7 @@ mountstats \- Displays various NFS client per-mount statistics
- .RB [ \-v | \-\-version ]
- .RB [ \-f | \-\-file
- .IR infile ]
--.RB [ \-s | \-\-since
-+.RB [ \-S | \-\-since
- .IR sincefile ]
- .RB [ \-3 ]
- .RB [ \-4 ]
-@@ -128,7 +128,7 @@ parameter is specified without the
- parameter, the command generates reports continuously.  This may not be used with the
- .BR \-f | \-\-file
- or
--.BR \-s | \-\-since 
-+.BR \-S | \-\-since 
- options.
- .SS Options specific to the nfsstat sub-command
- .IP "\fB\-3\fP"
-diff --git a/utils/exportfs/exports.man b/utils/exportfs/exports.man
-index 3d974d9..88d9fbe 100644
---- a/utils/exportfs/exports.man
-+++ b/utils/exportfs/exports.man
-@@ -218,16 +218,46 @@ This option can be very useful in some situations, but it should be
- used with due care, and only after confirming that the client system
- copes with the situation effectively.
- 
--The option can be explicitly disabled with
-+The option can be explicitly disabled for NFSv2 and NFSv3 with
- .IR hide .
-+
-+This option is not relevant when NFSv4 is use.  NFSv4 never hides
-+subordinate filesystems.  Any filesystem that is exported will be
-+visible where expected when using NFSv4.
- .TP
--.IR crossmnt
-+.I crossmnt
- This option is similar to
- .I nohide
--but it makes it possible for clients to move from the filesystem marked
--with crossmnt to exported filesystems mounted on it.  Thus when a child
--filesystem "B" is mounted on a parent "A", setting crossmnt on "A" has
--the same effect as setting "nohide" on B.
-+but it makes it possible for clients to access all filesystems mounted
-+on a filesystem marked with
-+.IR crossmnt .
-+Thus when a child filesystem "B" is mounted on a parent "A", setting
-+crossmnt on "A" has a similar effect to setting "nohide" on B.
-+
-+With
-+.I nohide
-+the child filesystem needs to be explicitly exported.  With
-+.I crossmnt
-+it need not.  If a child of a
-+.I crossmnt
-+file is not explicitly exported, then it will be implicitly exported
-+with the same export options as the parent, except for
-+.IR fsid= .
-+This makes it impossible to
-+.B not
-+export a child of a
-+.I crossmnt
-+filesystem.  If some but not all subordinate filesystems of a parent
-+are to be exported, then they must be explicitly exported and the
-+parent should not have
-+.I crossmnt
-+set.
-+
-+The
-+.I nocrossmnt
-+option can explictly disable
-+.I crossmnt
-+if it was previously set.  This is rarely useful.
- .TP
- .IR no_subtree_check
- This option disables subtree checking, which has mild security
-diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c
-index c23d384..7d250f9 100644
---- a/utils/mountd/cache.c
-+++ b/utils/mountd/cache.c
-@@ -376,7 +376,7 @@ static char *next_mnt(void **v, char *p)
- 		*v = f;
- 	} else
- 		f = *v;
--	while ((me = getmntent(f)) != NULL &&
-+	while ((me = getmntent(f)) != NULL && l > 1 &&
- 	       (strncmp(me->mnt_dir, p, l) != 0 ||
- 		me->mnt_dir[l] != '/'))
- 		;
-diff --git a/utils/statd/rmtcall.c b/utils/statd/rmtcall.c
-index fd576d9..66a6eeb 100644
---- a/utils/statd/rmtcall.c
-+++ b/utils/statd/rmtcall.c
-@@ -221,6 +221,9 @@ process_reply(FD_SET_TYPE *rfds)
- 	if (sockfd == -1 || !FD_ISSET(sockfd, rfds))
- 		return 0;
- 
-+	/* Should not be processed again. */
-+	FD_CLR (sockfd, rfds);
-+
- 	if (!(lp = recv_rply(&port)))
- 		return 1;
- 
-diff --git a/utils/statd/statd.c b/utils/statd/statd.c
-index 60ce6d1..2b7a167 100644
---- a/utils/statd/statd.c
-+++ b/utils/statd/statd.c
-@@ -393,7 +393,7 @@ int main (int argc, char **argv)
- 		simulator (--argc, ++argv);	/* simulator() does exit() */
- #endif
- 
--	daemon_init(!(run_mode & MODE_NODAEMON));
-+	daemon_init((run_mode & MODE_NODAEMON));
- 
- 	if (run_mode & MODE_LOG_STDERR) {
- 		xlog_syslog(0);
diff --git a/nfs-utils-1.3.3-rc2.patch b/nfs-utils-1.3.3-rc2.patch
deleted file mode 100644
index e09262f..0000000
--- a/nfs-utils-1.3.3-rc2.patch
+++ /dev/null
@@ -1,442 +0,0 @@
-diff --git a/configure.ac b/configure.ac
-index 8e427e3..e61430f 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -60,7 +60,6 @@ AC_ARG_WITH(systemd,
- 	[AC_HELP_STRING([--with-systemd@<:@=unit-dir-path@:>@],
- 			[install systemd unit files @<:@Default: no, and path defaults to /usr/lib/systemd/system if not given@:>@])],
- 	test "$withval" = "no" && use_systemd=0 || unitdir=$withval use_systemd=1
--	use_systemd=0
- 	)
- 	AM_CONDITIONAL(INSTALL_SYSTEMD, [test "$use_systemd" = 1])
- 	AC_SUBST(unitdir)
-diff --git a/support/nfs/exports.c b/support/nfs/exports.c
-index eb782b9..4b17d3c 100644
---- a/support/nfs/exports.c
-+++ b/support/nfs/exports.c
-@@ -154,6 +154,7 @@ getexportent(int fromkernel, int fromexports)
- 		}
- 	}
- 
-+	xfree(ee.e_hostname);
- 	ee = def_ee;
- 
- 	/* Check for default client */
-@@ -176,7 +177,6 @@ getexportent(int fromkernel, int fromexports)
- 		if (!has_default_opts)
- 			xlog(L_WARNING, "No options for %s %s: suggest %s(sync) to avoid warning", ee.e_path, exp, exp);
- 	}
--	xfree(ee.e_hostname);
- 	ee.e_hostname = xstrdup(hostname);
- 
- 	if (parseopts(opt, &ee, fromexports && !has_default_subtree_opts, NULL) < 0)
-diff --git a/systemd/Makefile.am b/systemd/Makefile.am
-index 16cf5e6..fbcabb1 100644
---- a/systemd/Makefile.am
-+++ b/systemd/Makefile.am
-@@ -3,7 +3,6 @@
- MAINTAINERCLEANFILES = Makefile.in
- 
- unit_files =  \
--    nfs-blkmap.target \
-     nfs-client.target \
-     \
-     auth-rpcgss-module.service \
-diff --git a/systemd/README b/systemd/README
-index a2a5f06..bbd7790 100644
---- a/systemd/README
-+++ b/systemd/README
-@@ -24,7 +24,7 @@ by a suitable 'preset' setting:
-     is started by /usr/sbin/start-statd which mount.nfs will run
-     if statd is needed.
- 
-- nfs-blkmap.target
-+ nfs-blkmap.service
-     If enabled, then blkmapd will be run when nfs-client.target is
-     started.
- 
-diff --git a/systemd/auth-rpcgss-module.service b/systemd/auth-rpcgss-module.service
-index 0355e13..5241f7b 100644
---- a/systemd/auth-rpcgss-module.service
-+++ b/systemd/auth-rpcgss-module.service
-@@ -6,6 +6,7 @@
- # unit will fail.  But that's OK.)
- [Unit]
- Description=Kernel Module supporting RPCSEC_GSS
-+DefaultDependencies=no
- Before=gssproxy.service rpc-svcgssd.service rpc-gssd.service
- Wants=gssproxy.service rpc-svcgssd.service rpc-gssd.service
- ConditionPathExists=/etc/krb5.keytab
-diff --git a/systemd/nfs-blkmap.service b/systemd/nfs-blkmap.service
-index f470e3d..ddbf4e9 100644
---- a/systemd/nfs-blkmap.service
-+++ b/systemd/nfs-blkmap.service
-@@ -5,12 +5,13 @@ Conflicts=umount.target
- After=var-lib-nfs-rpc_pipefs.mount
- Requires=var-lib-nfs-rpc_pipefs.mount
- 
--Requisite=nfs-blkmap.target
--After=nfs-blkmap.target
--
- PartOf=nfs-utils.service
- 
- [Service]
- Type=forking
- PIDFile=/var/run/blkmapd.pid
-+EnvironmentFile=-/run/sysconfig/nfs-utils
- ExecStart=/usr/sbin/blkmapd $BLKMAPDARGS
-+
-+[Install]
-+WantedBy=nfs-client.target
-diff --git a/systemd/nfs-blkmap.target b/systemd/nfs-blkmap.target
-deleted file mode 100644
-index fbcc111..0000000
---- a/systemd/nfs-blkmap.target
-+++ /dev/null
-@@ -1,8 +0,0 @@
--[Unit]
--Description= PNFS blkmaping enablement.
--# If this target is enabled, then blkmapd will be started
--# as required.  If it is not enabled it won't.
--
--[Install]
--WantedBy=remote-fs.target
--WantedBy=multi-user.target
-\ No newline at end of file
-diff --git a/systemd/nfs-client.target b/systemd/nfs-client.target
-index 9b792a3..8a8300a 100644
---- a/systemd/nfs-client.target
-+++ b/systemd/nfs-client.target
-@@ -5,8 +5,7 @@ Wants=remote-fs-pre.target
- 
- # Note: we don't "Wants=rpc-statd.service" as "mount.nfs" will arrange to
- # start that on demand if needed.
--Wants=nfs-blkmap.service rpc-statd-notify.service
--After=nfs-blkmap.service
-+Wants=rpc-statd-notify.service
- 
- # GSS services dependencies and ordering
- Wants=auth-rpcgss-module.service
-diff --git a/systemd/nfs-config.service b/systemd/nfs-config.service
-index 64010e6..7f65305 100644
---- a/systemd/nfs-config.service
-+++ b/systemd/nfs-config.service
-@@ -1,5 +1,7 @@
- [Unit]
- Description=Preprocess NFS configuration
-+After=local-fs.target
-+DefaultDependencies=no
- 
- [Service]
- Type=oneshot
-diff --git a/systemd/nfs-idmapd.service b/systemd/nfs-idmapd.service
-index e84f8c8..df3dd9d 100644
---- a/systemd/nfs-idmapd.service
-+++ b/systemd/nfs-idmapd.service
-@@ -1,7 +1,8 @@
- [Unit]
- Description=NFSv4 ID-name mapping service
-+DefaultDependencies=no
- Requires=var-lib-nfs-rpc_pipefs.mount
--After=var-lib-nfs-rpc_pipefs.mount
-+After=var-lib-nfs-rpc_pipefs.mount local-fs.target
- 
- BindsTo=nfs-server.service
- 
-diff --git a/systemd/nfs-mountd.service b/systemd/nfs-mountd.service
-index d908afe..8a39f3e 100644
---- a/systemd/nfs-mountd.service
-+++ b/systemd/nfs-mountd.service
-@@ -1,8 +1,9 @@
- [Unit]
- Description=NFS Mount Daemon
-+DefaultDependencies=no
- Requires=proc-fs-nfsd.mount
- After=proc-fs-nfsd.mount
--After=network.target
-+After=network.target local-fs.target
- BindsTo=nfs-server.service
- 
- Wants=nfs-config.service
-diff --git a/systemd/nfs-server.service b/systemd/nfs-server.service
-index 8010aad..db801cb 100644
---- a/systemd/nfs-server.service
-+++ b/systemd/nfs-server.service
-@@ -1,10 +1,12 @@
- [Unit]
- Description=NFS server and services
-+DefaultDependencies=no
- Requires= network.target proc-fs-nfsd.mount rpcbind.target
- Requires= nfs-mountd.service
- Wants=rpc-statd.service nfs-idmapd.service
- Wants=rpc-statd-notify.service
- 
-+After= local-fs.target
- After= network.target proc-fs-nfsd.mount rpcbind.target nfs-mountd.service
- After= nfs-idmapd.service rpc-statd.service
- Before= rpc-statd-notify.service
-@@ -13,6 +15,9 @@ Before= rpc-statd-notify.service
- Wants=auth-rpcgss-module.service
- After=rpc-gssd.service gssproxy.service rpc-svcgssd.service
- 
-+# start/stop server before/after client
-+Before=remote-fs-pre.target
-+
- Wants=nfs-config.service
- After=nfs-config.service
- 
-diff --git a/systemd/rpc-statd-notify.service b/systemd/rpc-statd-notify.service
-index 941afe5..89ba36c 100644
---- a/systemd/rpc-statd-notify.service
-+++ b/systemd/rpc-statd-notify.service
-@@ -1,7 +1,8 @@
- [Unit]
- Description=Notify NFS peers of a restart
--Requires=network-online.target
--After=network-online.target nss-lookup.target
-+DefaultDependencies=no
-+Requires=network.target
-+After=local-fs.target network.target nss-lookup.target
- 
- # if we run an nfs server, it needs to be running before we
- # tell clients that it has restarted.
-diff --git a/systemd/rpc-svcgssd.service b/systemd/rpc-svcgssd.service
-index f7424b0..41177b6 100644
---- a/systemd/rpc-svcgssd.service
-+++ b/systemd/rpc-svcgssd.service
-@@ -1,7 +1,8 @@
- [Unit]
- Description=RPC security service for NFS server
-+DefaultDependencies=no
- Requires=var-lib-nfs-rpc_pipefs.mount
--After=var-lib-nfs-rpc_pipefs.mount
-+After=var-lib-nfs-rpc_pipefs.mount local-fs.target
- PartOf=nfs-server.service
- PartOf=nfs-utils.service
- 
-diff --git a/tools/mountstats/mountstats.man b/tools/mountstats/mountstats.man
-index bee3f86..a9df1e4 100644
---- a/tools/mountstats/mountstats.man
-+++ b/tools/mountstats/mountstats.man
-@@ -10,7 +10,7 @@ mountstats \- Displays various NFS client per-mount statistics
- .RB [ \-v | \-\-version ]
- .RB [ \-f | \-\-file
- .IR infile ]
--.RB [ \-s | \-\-since
-+.RB [ \-S | \-\-since
- .IR sincefile ]
- .\" .RB [ \-n | \-\-nfs | \-r | \-\-rpc | \-R | \-\-raw ]
- .R [
-@@ -27,7 +27,7 @@ mountstats \- Displays various NFS client per-mount statistics
- .RB [ \-v | \-\-version ]
- .RB [ \-f | \-\-file
- .IR infile ]
--.RB [ \-s | \-\-since
-+.RB [ \-S | \-\-since
- .IR sincefile ]
- .RI [ interval ]
- .RI [ count ]
-@@ -38,7 +38,7 @@ mountstats \- Displays various NFS client per-mount statistics
- .RB [ \-v | \-\-version ]
- .RB [ \-f | \-\-file
- .IR infile ]
--.RB [ \-s | \-\-since
-+.RB [ \-S | \-\-since
- .IR sincefile ]
- .RB [ \-3 ]
- .RB [ \-4 ]
-@@ -128,7 +128,7 @@ parameter is specified without the
- parameter, the command generates reports continuously.  This may not be used with the
- .BR \-f | \-\-file
- or
--.BR \-s | \-\-since 
-+.BR \-S | \-\-since 
- options.
- .SS Options specific to the nfsstat sub-command
- .IP "\fB\-3\fP"
-diff --git a/tools/mountstats/mountstats.py b/tools/mountstats/mountstats.py
-index fd73feb..38943eb 100644
---- a/tools/mountstats/mountstats.py
-+++ b/tools/mountstats/mountstats.py
-@@ -686,7 +686,7 @@ def mountstats_command(args):
-     """Mountstats command
-     """
-     mountstats = parse_stats_file(args.infile)
--    mountpoints = args.mountpoints
-+    mountpoints = [os.path.normpath(mp) for mp in args.mountpoints]
- 
-     # make certain devices contains only NFS mount points
-     if len(mountpoints) > 0:
-@@ -708,7 +708,7 @@ def mountstats_command(args):
-                 mountpoints += [device]
-     if len(mountpoints) == 0:
-         print('No NFS mount points were found')
--        return
-+        return 1
- 
-     if args.since:
-         old_mountstats = parse_stats_file(args.since)
-@@ -729,12 +729,13 @@ def mountstats_command(args):
-     args.infile.close()
-     if args.since:
-         args.since.close()
-+    return 0
- 
- def nfsstat_command(args):
-     """nfsstat-like command for NFS mount points
-     """
-     mountstats = parse_stats_file(args.infile)
--    mountpoints = args.mountpoints
-+    mountpoints = [os.path.normpath(mp) for mp in args.mountpoints]
-     v3stats = DeviceData()
-     v3stats.setup_accumulator(Nfsv3ops)
-     v4stats = DeviceData()
-@@ -766,7 +767,7 @@ def nfsstat_command(args):
-                 mountpoints += [device]
-     if len(mountpoints) == 0:
-         print('No NFS mount points were found')
--        return
-+        return 1
- 
-     if args.since:
-         old_mountstats = parse_stats_file(args.since)
-@@ -803,6 +804,7 @@ def nfsstat_command(args):
-     args.infile.close()
-     if args.since:
-         args.since.close()
-+    return 0
- 
- def print_iostat_summary(old, new, devices, time):
-     for device in devices:
-@@ -820,7 +822,7 @@ def iostat_command(args):
-     """iostat-like command for NFS mount points
-     """
-     mountstats = parse_stats_file(args.infile)
--    devices = args.mountpoints
-+    devices = [os.path.normpath(mp) for mp in args.mountpoints]
- 
-     if args.since:
-         old_mountstats = parse_stats_file(args.since)
-@@ -847,7 +849,7 @@ def iostat_command(args):
-                 devices += [device]
-     if len(devices) == 0:
-         print('No NFS mount points were found')
--        return
-+        return 1
- 
-     sample_time = 0
- 
-@@ -875,6 +877,7 @@ def iostat_command(args):
-     args.infile.close()
-     if args.since:
-         args.since.close()
-+    return 0
- 
- class ICMAction(argparse.Action):
-     """Custom action to deal with interval, count, and mountpoints.
-@@ -986,7 +989,7 @@ try:
-         sys.stdout.close()
-         sys.stderr.close()
-         sys.exit(res)
--except (SystemExit, KeyboardInterrupt, RuntimeError):
-+except (KeyboardInterrupt, RuntimeError):
-     sys.exit(1)
- except IOError:
-     pass
-diff --git a/utils/exportfs/exports.man b/utils/exportfs/exports.man
-index 3d974d9..88d9fbe 100644
---- a/utils/exportfs/exports.man
-+++ b/utils/exportfs/exports.man
-@@ -218,16 +218,46 @@ This option can be very useful in some situations, but it should be
- used with due care, and only after confirming that the client system
- copes with the situation effectively.
- 
--The option can be explicitly disabled with
-+The option can be explicitly disabled for NFSv2 and NFSv3 with
- .IR hide .
-+
-+This option is not relevant when NFSv4 is use.  NFSv4 never hides
-+subordinate filesystems.  Any filesystem that is exported will be
-+visible where expected when using NFSv4.
- .TP
--.IR crossmnt
-+.I crossmnt
- This option is similar to
- .I nohide
--but it makes it possible for clients to move from the filesystem marked
--with crossmnt to exported filesystems mounted on it.  Thus when a child
--filesystem "B" is mounted on a parent "A", setting crossmnt on "A" has
--the same effect as setting "nohide" on B.
-+but it makes it possible for clients to access all filesystems mounted
-+on a filesystem marked with
-+.IR crossmnt .
-+Thus when a child filesystem "B" is mounted on a parent "A", setting
-+crossmnt on "A" has a similar effect to setting "nohide" on B.
-+
-+With
-+.I nohide
-+the child filesystem needs to be explicitly exported.  With
-+.I crossmnt
-+it need not.  If a child of a
-+.I crossmnt
-+file is not explicitly exported, then it will be implicitly exported
-+with the same export options as the parent, except for
-+.IR fsid= .
-+This makes it impossible to
-+.B not
-+export a child of a
-+.I crossmnt
-+filesystem.  If some but not all subordinate filesystems of a parent
-+are to be exported, then they must be explicitly exported and the
-+parent should not have
-+.I crossmnt
-+set.
-+
-+The
-+.I nocrossmnt
-+option can explictly disable
-+.I crossmnt
-+if it was previously set.  This is rarely useful.
- .TP
- .IR no_subtree_check
- This option disables subtree checking, which has mild security
-diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c
-index c23d384..7d250f9 100644
---- a/utils/mountd/cache.c
-+++ b/utils/mountd/cache.c
-@@ -376,7 +376,7 @@ static char *next_mnt(void **v, char *p)
- 		*v = f;
- 	} else
- 		f = *v;
--	while ((me = getmntent(f)) != NULL &&
-+	while ((me = getmntent(f)) != NULL && l > 1 &&
- 	       (strncmp(me->mnt_dir, p, l) != 0 ||
- 		me->mnt_dir[l] != '/'))
- 		;
-diff --git a/utils/statd/rmtcall.c b/utils/statd/rmtcall.c
-index fd576d9..66a6eeb 100644
---- a/utils/statd/rmtcall.c
-+++ b/utils/statd/rmtcall.c
-@@ -221,6 +221,9 @@ process_reply(FD_SET_TYPE *rfds)
- 	if (sockfd == -1 || !FD_ISSET(sockfd, rfds))
- 		return 0;
- 
-+	/* Should not be processed again. */
-+	FD_CLR (sockfd, rfds);
-+
- 	if (!(lp = recv_rply(&port)))
- 		return 1;
- 
-diff --git a/utils/statd/statd.c b/utils/statd/statd.c
-index 60ce6d1..2b7a167 100644
---- a/utils/statd/statd.c
-+++ b/utils/statd/statd.c
-@@ -393,7 +393,7 @@ int main (int argc, char **argv)
- 		simulator (--argc, ++argv);	/* simulator() does exit() */
- #endif
- 
--	daemon_init(!(run_mode & MODE_NODAEMON));
-+	daemon_init((run_mode & MODE_NODAEMON));
- 
- 	if (run_mode & MODE_LOG_STDERR) {
- 		xlog_syslog(0);
diff --git a/nfs-utils-1.3.3-rc4.patch b/nfs-utils-1.3.3-rc4.patch
new file mode 100644
index 0000000..83c9488
--- /dev/null
+++ b/nfs-utils-1.3.3-rc4.patch
@@ -0,0 +1,782 @@
+diff --git a/configure.ac b/configure.ac
+index 8e427e3..926b044 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -60,7 +60,6 @@ AC_ARG_WITH(systemd,
+ 	[AC_HELP_STRING([--with-systemd@<:@=unit-dir-path@:>@],
+ 			[install systemd unit files @<:@Default: no, and path defaults to /usr/lib/systemd/system if not given@:>@])],
+ 	test "$withval" = "no" && use_systemd=0 || unitdir=$withval use_systemd=1
+-	use_systemd=0
+ 	)
+ 	AM_CONDITIONAL(INSTALL_SYSTEMD, [test "$use_systemd" = 1])
+ 	AC_SUBST(unitdir)
+@@ -164,6 +163,8 @@ if test "$enable_mount" = yes; then
+ 				[Link mount.nfs with libmount @<:@default=no@:>@])],
+ 		enable_libmount=$enableval,
+ 		enable_libmount=no)
++else
++	enable_libmount=no
+ fi
+ 
+ AC_ARG_ENABLE(tirpc,
+@@ -214,9 +215,16 @@ fi
+ AC_ARG_ENABLE(nfsdcltrack,
+ 	[AC_HELP_STRING([--disable-nfsdcltrack],
+ 			[disable NFSv4 clientid tracking programs @<:@default=no@:>@])],
+-	enable_nfsdctrack=$enableval,
++	enable_nfsdcltrack=$enableval,
+ 	enable_nfsdcltrack="yes")
+ 
++AC_ARG_ENABLE(osdlogin,
++	[AC_HELP_STRING([--enable-osdlogin],
++			[enable osd_login scripts @<:@default=no@:>@])],
++	enable_osdlogin=$enableval,
++	enable_osdlogin="no")
++	AM_CONDITIONAL(CONFIG_OSD_LOGIN, [test "$enable_osdlogin" = "yes" ])
++
+ dnl Check for TI-RPC library and headers
+ AC_LIBTIRPC
+ 
+@@ -347,7 +355,7 @@ AC_SUBST(LIBBSD)
+ AC_SUBST(LIBBLKID)
+ AC_SUBST(LIBDL)
+ 
+-if test "$enable_libmount" != no; then
++if test "$enable_libmount" = yes; then
+    AC_CHECK_LIB(mount, mnt_context_do_mount, [LIBMOUNT="-lmount"], AC_MSG_ERROR([libmount needed]))
+    AC_CHECK_HEADER(libmount/libmount.h, , AC_MSG_ERROR([Cannot find libmount header file libmount/libmount.h]))
+ fi
+diff --git a/support/include/nfs/export.h b/support/include/nfs/export.h
+index 2f59e6a..1194255 100644
+--- a/support/include/nfs/export.h
++++ b/support/include/nfs/export.h
+@@ -26,6 +26,7 @@
+ #define	NFSEXP_CROSSMOUNT	0x4000
+ #define NFSEXP_NOACL		0x8000 /* reserved for possible ACL related use */
+ #define NFSEXP_V4ROOT		0x10000
++#define NFSEXP_PNFS            0x20000
+ /*
+  * All flags supported by the kernel before addition of the
+  * export_features interface:
+diff --git a/support/nfs/exports.c b/support/nfs/exports.c
+index eb782b9..0aea6f1 100644
+--- a/support/nfs/exports.c
++++ b/support/nfs/exports.c
+@@ -154,6 +154,7 @@ getexportent(int fromkernel, int fromexports)
+ 		}
+ 	}
+ 
++	xfree(ee.e_hostname);
+ 	ee = def_ee;
+ 
+ 	/* Check for default client */
+@@ -176,7 +177,6 @@ getexportent(int fromkernel, int fromexports)
+ 		if (!has_default_opts)
+ 			xlog(L_WARNING, "No options for %s %s: suggest %s(sync) to avoid warning", ee.e_path, exp, exp);
+ 	}
+-	xfree(ee.e_hostname);
+ 	ee.e_hostname = xstrdup(hostname);
+ 
+ 	if (parseopts(opt, &ee, fromexports && !has_default_subtree_opts, NULL) < 0)
+@@ -275,6 +275,7 @@ putexportent(struct exportent *ep)
+ 		"no_" : "");
+ 	if (ep->e_flags & NFSEXP_NOREADDIRPLUS)
+ 		fprintf(fp, "nordirplus,");
++	fprintf(fp, "%spnfs,", (ep->e_flags & NFSEXP_PNFS)? "" : "no_");
+ 	if (ep->e_flags & NFSEXP_FSID) {
+ 		fprintf(fp, "fsid=%d,", ep->e_fsid);
+ 	}
+@@ -407,7 +408,7 @@ int secinfo_addflavor(struct flav_info *flav, struct exportent *ep)
+ 	struct sec_entry *p;
+ 
+ 	for (p=ep->e_secinfo; p->flav; p++) {
+-		if (p->flav == flav)
++		if (p->flav == flav || p->flav->fnum == flav->fnum)
+ 			return p - ep->e_secinfo;
+ 	}
+ 	if (p - ep->e_secinfo >= SECFLAVOR_COUNT) {
+@@ -581,6 +582,10 @@ parseopts(char *cp, struct exportent *ep, int warn, int *had_subtree_opt_ptr)
+ 			clearflags(NFSEXP_NOACL, active, ep);
+ 		else if (strcmp(opt, "no_acl") == 0)
+ 			setflags(NFSEXP_NOACL, active, ep);
++		else if (!strcmp(opt, "pnfs"))
++			setflags(NFSEXP_PNFS, active, ep);
++		else if (!strcmp(opt, "no_pnfs"))
++			clearflags(NFSEXP_PNFS, active, ep);
+ 		else if (strncmp(opt, "anonuid=", 8) == 0) {
+ 			char *oe;
+ 			ep->e_anonuid = strtol(opt+8, &oe, 10);
+diff --git a/systemd/Makefile.am b/systemd/Makefile.am
+index 16cf5e6..fbcabb1 100644
+--- a/systemd/Makefile.am
++++ b/systemd/Makefile.am
+@@ -3,7 +3,6 @@
+ MAINTAINERCLEANFILES = Makefile.in
+ 
+ unit_files =  \
+-    nfs-blkmap.target \
+     nfs-client.target \
+     \
+     auth-rpcgss-module.service \
+diff --git a/systemd/README b/systemd/README
+index a2a5f06..bbd7790 100644
+--- a/systemd/README
++++ b/systemd/README
+@@ -24,7 +24,7 @@ by a suitable 'preset' setting:
+     is started by /usr/sbin/start-statd which mount.nfs will run
+     if statd is needed.
+ 
+- nfs-blkmap.target
++ nfs-blkmap.service
+     If enabled, then blkmapd will be run when nfs-client.target is
+     started.
+ 
+diff --git a/systemd/auth-rpcgss-module.service b/systemd/auth-rpcgss-module.service
+index 0355e13..5241f7b 100644
+--- a/systemd/auth-rpcgss-module.service
++++ b/systemd/auth-rpcgss-module.service
+@@ -6,6 +6,7 @@
+ # unit will fail.  But that's OK.)
+ [Unit]
+ Description=Kernel Module supporting RPCSEC_GSS
++DefaultDependencies=no
+ Before=gssproxy.service rpc-svcgssd.service rpc-gssd.service
+ Wants=gssproxy.service rpc-svcgssd.service rpc-gssd.service
+ ConditionPathExists=/etc/krb5.keytab
+diff --git a/systemd/nfs-blkmap.service b/systemd/nfs-blkmap.service
+index f470e3d..ddbf4e9 100644
+--- a/systemd/nfs-blkmap.service
++++ b/systemd/nfs-blkmap.service
+@@ -5,12 +5,13 @@ Conflicts=umount.target
+ After=var-lib-nfs-rpc_pipefs.mount
+ Requires=var-lib-nfs-rpc_pipefs.mount
+ 
+-Requisite=nfs-blkmap.target
+-After=nfs-blkmap.target
+-
+ PartOf=nfs-utils.service
+ 
+ [Service]
+ Type=forking
+ PIDFile=/var/run/blkmapd.pid
++EnvironmentFile=-/run/sysconfig/nfs-utils
+ ExecStart=/usr/sbin/blkmapd $BLKMAPDARGS
++
++[Install]
++WantedBy=nfs-client.target
+diff --git a/systemd/nfs-blkmap.target b/systemd/nfs-blkmap.target
+deleted file mode 100644
+index fbcc111..0000000
+--- a/systemd/nfs-blkmap.target
++++ /dev/null
+@@ -1,8 +0,0 @@
+-[Unit]
+-Description= PNFS blkmaping enablement.
+-# If this target is enabled, then blkmapd will be started
+-# as required.  If it is not enabled it won't.
+-
+-[Install]
+-WantedBy=remote-fs.target
+-WantedBy=multi-user.target
+\ No newline at end of file
+diff --git a/systemd/nfs-client.target b/systemd/nfs-client.target
+index 9b792a3..8a8300a 100644
+--- a/systemd/nfs-client.target
++++ b/systemd/nfs-client.target
+@@ -5,8 +5,7 @@ Wants=remote-fs-pre.target
+ 
+ # Note: we don't "Wants=rpc-statd.service" as "mount.nfs" will arrange to
+ # start that on demand if needed.
+-Wants=nfs-blkmap.service rpc-statd-notify.service
+-After=nfs-blkmap.service
++Wants=rpc-statd-notify.service
+ 
+ # GSS services dependencies and ordering
+ Wants=auth-rpcgss-module.service
+diff --git a/systemd/nfs-config.service b/systemd/nfs-config.service
+index 64010e6..7f65305 100644
+--- a/systemd/nfs-config.service
++++ b/systemd/nfs-config.service
+@@ -1,5 +1,7 @@
+ [Unit]
+ Description=Preprocess NFS configuration
++After=local-fs.target
++DefaultDependencies=no
+ 
+ [Service]
+ Type=oneshot
+diff --git a/systemd/nfs-idmapd.service b/systemd/nfs-idmapd.service
+index e84f8c8..df3dd9d 100644
+--- a/systemd/nfs-idmapd.service
++++ b/systemd/nfs-idmapd.service
+@@ -1,7 +1,8 @@
+ [Unit]
+ Description=NFSv4 ID-name mapping service
++DefaultDependencies=no
+ Requires=var-lib-nfs-rpc_pipefs.mount
+-After=var-lib-nfs-rpc_pipefs.mount
++After=var-lib-nfs-rpc_pipefs.mount local-fs.target
+ 
+ BindsTo=nfs-server.service
+ 
+diff --git a/systemd/nfs-mountd.service b/systemd/nfs-mountd.service
+index d908afe..8a39f3e 100644
+--- a/systemd/nfs-mountd.service
++++ b/systemd/nfs-mountd.service
+@@ -1,8 +1,9 @@
+ [Unit]
+ Description=NFS Mount Daemon
++DefaultDependencies=no
+ Requires=proc-fs-nfsd.mount
+ After=proc-fs-nfsd.mount
+-After=network.target
++After=network.target local-fs.target
+ BindsTo=nfs-server.service
+ 
+ Wants=nfs-config.service
+diff --git a/systemd/nfs-server.service b/systemd/nfs-server.service
+index 8010aad..db801cb 100644
+--- a/systemd/nfs-server.service
++++ b/systemd/nfs-server.service
+@@ -1,10 +1,12 @@
+ [Unit]
+ Description=NFS server and services
++DefaultDependencies=no
+ Requires= network.target proc-fs-nfsd.mount rpcbind.target
+ Requires= nfs-mountd.service
+ Wants=rpc-statd.service nfs-idmapd.service
+ Wants=rpc-statd-notify.service
+ 
++After= local-fs.target
+ After= network.target proc-fs-nfsd.mount rpcbind.target nfs-mountd.service
+ After= nfs-idmapd.service rpc-statd.service
+ Before= rpc-statd-notify.service
+@@ -13,6 +15,9 @@ Before= rpc-statd-notify.service
+ Wants=auth-rpcgss-module.service
+ After=rpc-gssd.service gssproxy.service rpc-svcgssd.service
+ 
++# start/stop server before/after client
++Before=remote-fs-pre.target
++
+ Wants=nfs-config.service
+ After=nfs-config.service
+ 
+diff --git a/systemd/rpc-statd-notify.service b/systemd/rpc-statd-notify.service
+index 941afe5..89ba36c 100644
+--- a/systemd/rpc-statd-notify.service
++++ b/systemd/rpc-statd-notify.service
+@@ -1,7 +1,8 @@
+ [Unit]
+ Description=Notify NFS peers of a restart
+-Requires=network-online.target
+-After=network-online.target nss-lookup.target
++DefaultDependencies=no
++Requires=network.target
++After=local-fs.target network.target nss-lookup.target
+ 
+ # if we run an nfs server, it needs to be running before we
+ # tell clients that it has restarted.
+diff --git a/systemd/rpc-svcgssd.service b/systemd/rpc-svcgssd.service
+index f7424b0..41177b6 100644
+--- a/systemd/rpc-svcgssd.service
++++ b/systemd/rpc-svcgssd.service
+@@ -1,7 +1,8 @@
+ [Unit]
+ Description=RPC security service for NFS server
++DefaultDependencies=no
+ Requires=var-lib-nfs-rpc_pipefs.mount
+-After=var-lib-nfs-rpc_pipefs.mount
++After=var-lib-nfs-rpc_pipefs.mount local-fs.target
+ PartOf=nfs-server.service
+ PartOf=nfs-utils.service
+ 
+diff --git a/tools/mountstats/mountstats.man b/tools/mountstats/mountstats.man
+index bee3f86..a9df1e4 100644
+--- a/tools/mountstats/mountstats.man
++++ b/tools/mountstats/mountstats.man
+@@ -10,7 +10,7 @@ mountstats \- Displays various NFS client per-mount statistics
+ .RB [ \-v | \-\-version ]
+ .RB [ \-f | \-\-file
+ .IR infile ]
+-.RB [ \-s | \-\-since
++.RB [ \-S | \-\-since
+ .IR sincefile ]
+ .\" .RB [ \-n | \-\-nfs | \-r | \-\-rpc | \-R | \-\-raw ]
+ .R [
+@@ -27,7 +27,7 @@ mountstats \- Displays various NFS client per-mount statistics
+ .RB [ \-v | \-\-version ]
+ .RB [ \-f | \-\-file
+ .IR infile ]
+-.RB [ \-s | \-\-since
++.RB [ \-S | \-\-since
+ .IR sincefile ]
+ .RI [ interval ]
+ .RI [ count ]
+@@ -38,7 +38,7 @@ mountstats \- Displays various NFS client per-mount statistics
+ .RB [ \-v | \-\-version ]
+ .RB [ \-f | \-\-file
+ .IR infile ]
+-.RB [ \-s | \-\-since
++.RB [ \-S | \-\-since
+ .IR sincefile ]
+ .RB [ \-3 ]
+ .RB [ \-4 ]
+@@ -128,7 +128,7 @@ parameter is specified without the
+ parameter, the command generates reports continuously.  This may not be used with the
+ .BR \-f | \-\-file
+ or
+-.BR \-s | \-\-since 
++.BR \-S | \-\-since 
+ options.
+ .SS Options specific to the nfsstat sub-command
+ .IP "\fB\-3\fP"
+diff --git a/tools/mountstats/mountstats.py b/tools/mountstats/mountstats.py
+index fd73feb..38943eb 100644
+--- a/tools/mountstats/mountstats.py
++++ b/tools/mountstats/mountstats.py
+@@ -686,7 +686,7 @@ def mountstats_command(args):
+     """Mountstats command
+     """
+     mountstats = parse_stats_file(args.infile)
+-    mountpoints = args.mountpoints
++    mountpoints = [os.path.normpath(mp) for mp in args.mountpoints]
+ 
+     # make certain devices contains only NFS mount points
+     if len(mountpoints) > 0:
+@@ -708,7 +708,7 @@ def mountstats_command(args):
+                 mountpoints += [device]
+     if len(mountpoints) == 0:
+         print('No NFS mount points were found')
+-        return
++        return 1
+ 
+     if args.since:
+         old_mountstats = parse_stats_file(args.since)
+@@ -729,12 +729,13 @@ def mountstats_command(args):
+     args.infile.close()
+     if args.since:
+         args.since.close()
++    return 0
+ 
+ def nfsstat_command(args):
+     """nfsstat-like command for NFS mount points
+     """
+     mountstats = parse_stats_file(args.infile)
+-    mountpoints = args.mountpoints
++    mountpoints = [os.path.normpath(mp) for mp in args.mountpoints]
+     v3stats = DeviceData()
+     v3stats.setup_accumulator(Nfsv3ops)
+     v4stats = DeviceData()
+@@ -766,7 +767,7 @@ def nfsstat_command(args):
+                 mountpoints += [device]
+     if len(mountpoints) == 0:
+         print('No NFS mount points were found')
+-        return
++        return 1
+ 
+     if args.since:
+         old_mountstats = parse_stats_file(args.since)
+@@ -803,6 +804,7 @@ def nfsstat_command(args):
+     args.infile.close()
+     if args.since:
+         args.since.close()
++    return 0
+ 
+ def print_iostat_summary(old, new, devices, time):
+     for device in devices:
+@@ -820,7 +822,7 @@ def iostat_command(args):
+     """iostat-like command for NFS mount points
+     """
+     mountstats = parse_stats_file(args.infile)
+-    devices = args.mountpoints
++    devices = [os.path.normpath(mp) for mp in args.mountpoints]
+ 
+     if args.since:
+         old_mountstats = parse_stats_file(args.since)
+@@ -847,7 +849,7 @@ def iostat_command(args):
+                 devices += [device]
+     if len(devices) == 0:
+         print('No NFS mount points were found')
+-        return
++        return 1
+ 
+     sample_time = 0
+ 
+@@ -875,6 +877,7 @@ def iostat_command(args):
+     args.infile.close()
+     if args.since:
+         args.since.close()
++    return 0
+ 
+ class ICMAction(argparse.Action):
+     """Custom action to deal with interval, count, and mountpoints.
+@@ -986,7 +989,7 @@ try:
+         sys.stdout.close()
+         sys.stderr.close()
+         sys.exit(res)
+-except (SystemExit, KeyboardInterrupt, RuntimeError):
++except (KeyboardInterrupt, RuntimeError):
+     sys.exit(1)
+ except IOError:
+     pass
+diff --git a/utils/blkmapd/device-inq.c b/utils/blkmapd/device-inq.c
+index eabc70c..c5bf71f 100644
+--- a/utils/blkmapd/device-inq.c
++++ b/utils/blkmapd/device-inq.c
+@@ -179,6 +179,7 @@ struct bl_serial *bldev_read_serial(int fd, const char *filename)
+ 	char *buffer;
+ 	struct bl_dev_id *dev_root, *dev_id;
+ 	unsigned int pos, len, current_id = 0;
++	size_t devid_len = sizeof(struct bl_dev_id) - sizeof(unsigned char);
+ 
+ 	status = bldev_inquire_pages(fd, 0x83, &buffer);
+ 	if (status)
+@@ -189,7 +190,11 @@ struct bl_serial *bldev_read_serial(int fd, const char *filename)
+ 	pos = 0;
+ 	current_id = 0;
+ 	len = dev_root->len;
+-	while (pos < (len - sizeof(struct bl_dev_id) + sizeof(unsigned char))) {
++
++	if (len < devid_len)
++		goto out;
++
++	while (pos < (len - devid_len)) {
+ 		dev_id = (struct bl_dev_id *)&(dev_root->data[pos]);
+ 		if ((dev_id->ids & 0xf) < current_id)
+ 			continue;
+@@ -221,8 +226,7 @@ struct bl_serial *bldev_read_serial(int fd, const char *filename)
+ 		}
+ 		if (current_id == 3)
+ 			break;
+-		pos += (dev_id->len + sizeof(struct bl_dev_id) -
+-			sizeof(unsigned char));
++		pos += (dev_id->len + devid_len);
+ 	}
+  out:
+ 	if (!serial_out)
+diff --git a/utils/exportfs/exportfs.c b/utils/exportfs/exportfs.c
+index 48eac00..8758231 100644
+--- a/utils/exportfs/exportfs.c
++++ b/utils/exportfs/exportfs.c
+@@ -821,6 +821,8 @@ dump(int verbose, int export_format)
+ 				c = dumpopt(c, "nordirplus");
+ 			if (ep->e_flags & NFSEXP_NOACL)
+ 				c = dumpopt(c, "no_acl");
++			if (ep->e_flags & NFSEXP_PNFS)
++				c = dumpopt(c, "pnfs");
+ 			if (ep->e_flags & NFSEXP_FSID)
+ 				c = dumpopt(c, "fsid=%d", ep->e_fsid);
+ 			if (ep->e_uuid)
+diff --git a/utils/exportfs/exports.man b/utils/exportfs/exports.man
+index 3d974d9..9309246 100644
+--- a/utils/exportfs/exports.man
++++ b/utils/exportfs/exports.man
+@@ -218,16 +218,46 @@ This option can be very useful in some situations, but it should be
+ used with due care, and only after confirming that the client system
+ copes with the situation effectively.
+ 
+-The option can be explicitly disabled with
++The option can be explicitly disabled for NFSv2 and NFSv3 with
+ .IR hide .
++
++This option is not relevant when NFSv4 is use.  NFSv4 never hides
++subordinate filesystems.  Any filesystem that is exported will be
++visible where expected when using NFSv4.
+ .TP
+-.IR crossmnt
++.I crossmnt
+ This option is similar to
+ .I nohide
+-but it makes it possible for clients to move from the filesystem marked
+-with crossmnt to exported filesystems mounted on it.  Thus when a child
+-filesystem "B" is mounted on a parent "A", setting crossmnt on "A" has
+-the same effect as setting "nohide" on B.
++but it makes it possible for clients to access all filesystems mounted
++on a filesystem marked with
++.IR crossmnt .
++Thus when a child filesystem "B" is mounted on a parent "A", setting
++crossmnt on "A" has a similar effect to setting "nohide" on B.
++
++With
++.I nohide
++the child filesystem needs to be explicitly exported.  With
++.I crossmnt
++it need not.  If a child of a
++.I crossmnt
++file is not explicitly exported, then it will be implicitly exported
++with the same export options as the parent, except for
++.IR fsid= .
++This makes it impossible to
++.B not
++export a child of a
++.I crossmnt
++filesystem.  If some but not all subordinate filesystems of a parent
++are to be exported, then they must be explicitly exported and the
++parent should not have
++.I crossmnt
++set.
++
++The
++.I nocrossmnt
++option can explictly disable
++.I crossmnt
++if it was previously set.  This is rarely useful.
+ .TP
+ .IR no_subtree_check
+ This option disables subtree checking, which has mild security
+@@ -378,6 +408,15 @@ If the client asks for alternative locations for the export point, it
+ will be given this list of alternatives. (Note that actual replication
+ of the filesystem must be handled elsewhere.)
+ 
++.TP
++.IR pnfs
++This option allows enables the use of pNFS extension if protocol level
++is NFSv4.1 or higher, and the filesystem supports pNFS exports.  With
++pNFS clients can bypass the server and perform I/O directly to storage
++devices. The default can be explicitly requested with the
++.I no_pnfs
++option.
++
+ .SS User ID Mapping
+ .PP
+ .B nfsd
+diff --git a/utils/exportfs/nfsd.man b/utils/exportfs/nfsd.man
+index 47b73be..0c516fa 100644
+--- a/utils/exportfs/nfsd.man
++++ b/utils/exportfs/nfsd.man
+@@ -196,6 +196,7 @@ classes of tracing to be enabled.  Consult the kernel header files to
+ find out what number correspond to what tracing.
+ 
+ .SH SEE ALSO
++.BR nfsd (8),
+ .BR rpc.nfsd (8),
+ .BR exports (5),
+ .BR nfsstat (8),
+diff --git a/utils/mount/error.c b/utils/mount/error.c
+index e06f598..c9797fc 100644
+--- a/utils/mount/error.c
++++ b/utils/mount/error.c
+@@ -247,6 +247,9 @@ void mount_error(const char *spec, const char *mount_point, int error)
+ 		nfs_error(_("%s: please report the error to" PACKAGE_BUGREPORT),
+ 				progname);
+ 		break;
++	case EALREADY:
++		/* Error message has already been provided */
++		break;
+ 	default:
+ 		nfs_error(_("%s: %s"),
+ 			progname, strerror(error));
+diff --git a/utils/mount/mount.nfs.man b/utils/mount/mount.nfs.man
+index 1a4561b..15a82d5 100644
+--- a/utils/mount/mount.nfs.man
++++ b/utils/mount/mount.nfs.man
+@@ -15,16 +15,20 @@ is meant to be used by the
+ .BR mount (8)
+ command for mounting NFS shares. This subcommand, however, can also be used as a standalone command with limited functionality.
+ 
+-.BR mount.nfs4 
+-is used for mounting NFSv4 file system, while 
+-.BR mount.nfs 
+-is used to mount NFS file systems versions 3 or 2.
+ .I remotetarget 
+ is a server share usually in the form of 
+ .BR servername:/path/to/share.
+ .I dir 
+ is the directory on which the file system is to be mounted.
+ 
++Under Linux 2.6.32 and later kernel versions,
++.BR mount.nfs
++can mount all NFS file system versions.  Under earlier Linux kernel versions,
++.BR mount.nfs4
++must be used for mounting NFSv4 file systems while
++.BR mount.nfs
++must be used for NFSv3 and v2.
++
+ .SH OPTIONS
+ .TP
+ .BI "\-r"
+diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c
+index 76ecb32..c8f5a6d 100644
+--- a/utils/mount/stropts.c
++++ b/utils/mount/stropts.c
+@@ -108,12 +108,6 @@ static void nfs_default_version(struct nfsmount_info *mi)
+ 		return;
+ 	}
+ 
+-	if (mi->version.v_mode == V_GENERAL &&
+-		config_default_vers.v_mode == V_DEFAULT) {
+-		mi->version.v_mode = V_SPECIFIC;
+-		return;
+-	}
+-
+ 	if (mi->version.v_mode == V_DEFAULT &&
+ 		config_default_vers.v_mode != V_DEFAULT) {
+ 		mi->version.major = config_default_vers.major;
+@@ -121,9 +115,9 @@ static void nfs_default_version(struct nfsmount_info *mi)
+ 		return;
+ 	}
+ 
+-	if (mi->version.v_mode == V_GENERAL &&
+-		config_default_vers.v_mode != V_DEFAULT) {
+-		if (mi->version.major == config_default_vers.major)
++	if (mi->version.v_mode == V_GENERAL) {
++		if (config_default_vers.v_mode != V_DEFAULT &&
++		    mi->version.major == config_default_vers.major)
+ 			mi->version.minor = config_default_vers.minor;
+ 		return;
+ 	}
+@@ -298,6 +292,7 @@ static int nfs_verify_lock_option(struct mount_options *options)
+ 			    "required for remote locking."), progname);
+ 		nfs_error(_("%s: Either use '-o nolock' to keep "
+ 			    "locks local, or start statd."), progname);
++		errno = EALREADY; /* Don't print further error message */
+ 		return 0;
+ 	}
+ 
+@@ -742,8 +737,13 @@ static int nfs_do_mount_v4(struct nfsmount_info *mi,
+ 	}
+ 
+ 	if (mi->version.v_mode != V_SPECIFIC) {
+-		snprintf(version_opt, sizeof(version_opt) - 1,
+-			"vers=%lu.%lu", mi->version.major, mi->version.minor);
++		if (mi->version.v_mode == V_GENERAL)
++			snprintf(version_opt, sizeof(version_opt) - 1,
++				"vers=%lu", mi->version.major);
++		else
++			snprintf(version_opt, sizeof(version_opt) - 1,
++				"vers=%lu.%lu", mi->version.major,
++				mi->version.minor);
+ 
+ 		if (po_append(options, version_opt) == PO_FAILED) {
+ 			errno = EINVAL;
+diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c
+index c23d384..7d250f9 100644
+--- a/utils/mountd/cache.c
++++ b/utils/mountd/cache.c
+@@ -376,7 +376,7 @@ static char *next_mnt(void **v, char *p)
+ 		*v = f;
+ 	} else
+ 		f = *v;
+-	while ((me = getmntent(f)) != NULL &&
++	while ((me = getmntent(f)) != NULL && l > 1 &&
+ 	       (strncmp(me->mnt_dir, p, l) != 0 ||
+ 		me->mnt_dir[l] != '/'))
+ 		;
+diff --git a/utils/mountd/v4root.c b/utils/mountd/v4root.c
+index 34d098a..d521725 100644
+--- a/utils/mountd/v4root.c
++++ b/utils/mountd/v4root.c
+@@ -26,6 +26,7 @@
+ #include "nfslib.h"
+ #include "misc.h"
+ #include "v4root.h"
++#include "pseudoflavors.h"
+ 
+ int v4root_needed;
+ 
+@@ -56,22 +57,25 @@ static nfs_export pseudo_root = {
+ };
+ 
+ static void
+-set_pseudofs_security(struct exportent *pseudo, struct exportent *source)
++set_pseudofs_security(struct exportent *pseudo, int flags)
+ {
+-	struct sec_entry *se;
++	struct flav_info *flav;
+ 	int i;
+ 
+-	if (source->e_flags & NFSEXP_INSECURE_PORT)
++	if (flags & NFSEXP_INSECURE_PORT)
+ 		pseudo->e_flags |= NFSEXP_INSECURE_PORT;
+-	if ((source->e_flags & NFSEXP_ROOTSQUASH) == 0)
++	if ((flags & NFSEXP_ROOTSQUASH) == 0)
+ 		pseudo->e_flags &= ~NFSEXP_ROOTSQUASH;
+-	for (se = source->e_secinfo; se->flav; se++) {
++	for (flav = flav_map; flav < flav_map + flav_map_size; flav++) {
+ 		struct sec_entry *new;
+ 
+-		i = secinfo_addflavor(se->flav, pseudo);
++		if (!flav->fnum)
++			continue;
++
++		i = secinfo_addflavor(flav, pseudo);
+ 		new = &pseudo->e_secinfo[i];
+ 
+-		if (se->flags & NFSEXP_INSECURE_PORT)
++		if (flags & NFSEXP_INSECURE_PORT)
+ 			new->flags |= NFSEXP_INSECURE_PORT;
+ 	}
+ }
+@@ -91,7 +95,7 @@ v4root_create(char *path, nfs_export *export)
+ 	strncpy(eep.e_path, path, sizeof(eep.e_path));
+ 	if (strcmp(path, "/") != 0)
+ 		eep.e_flags &= ~NFSEXP_FSID;
+-	set_pseudofs_security(&eep, curexp);
++	set_pseudofs_security(&eep, curexp->e_flags);
+ 	exp = export_create(&eep, 0);
+ 	if (exp == NULL)
+ 		return NULL;
+@@ -139,7 +143,7 @@ pseudofs_update(char *hostname, char *path, nfs_export *source)
+ 		return 0;
+ 	}
+ 	/* Update an existing V4ROOT export: */
+-	set_pseudofs_security(&exp->m_export, &source->m_export);
++	set_pseudofs_security(&exp->m_export, source->m_export.e_flags);
+ 	return 0;
+ }
+ 
+diff --git a/utils/nfsd/nfsd.man b/utils/nfsd/nfsd.man
+index be21ed4..3ba847e 100644
+--- a/utils/nfsd/nfsd.man
++++ b/utils/nfsd/nfsd.man
+@@ -121,6 +121,7 @@ address family combinations that are marked visible in the
+ database.
+ 
+ .SH SEE ALSO
++.BR nfsd (7),
+ .BR rpc.mountd (8),
+ .BR exports (5),
+ .BR exportfs (8),
+diff --git a/utils/nfsidmap/nfsidmap.c b/utils/nfsidmap/nfsidmap.c
+index 5d62078..1f5ba67 100644
+--- a/utils/nfsidmap/nfsidmap.c
++++ b/utils/nfsidmap/nfsidmap.c
+@@ -323,7 +323,10 @@ int main(int argc, char **argv)
+ 	}
+ 	type = strtok(arg, ":");
+ 	value = strtok(NULL, ":");
+-
++    if (value == NULL) {
++		xlog_err("Error: Null uid/gid value.");
++		return 1;
++	}
+ 	if (verbose) {
+ 		xlog_warn("key: 0x%lx type: %s value: %s timeout %ld",
+ 			key, type, value, timeout);
+diff --git a/utils/statd/rmtcall.c b/utils/statd/rmtcall.c
+index fd576d9..66a6eeb 100644
+--- a/utils/statd/rmtcall.c
++++ b/utils/statd/rmtcall.c
+@@ -221,6 +221,9 @@ process_reply(FD_SET_TYPE *rfds)
+ 	if (sockfd == -1 || !FD_ISSET(sockfd, rfds))
+ 		return 0;
+ 
++	/* Should not be processed again. */
++	FD_CLR (sockfd, rfds);
++
+ 	if (!(lp = recv_rply(&port)))
+ 		return 1;
+ 
+diff --git a/utils/statd/statd.c b/utils/statd/statd.c
+index 60ce6d1..2b7a167 100644
+--- a/utils/statd/statd.c
++++ b/utils/statd/statd.c
+@@ -393,7 +393,7 @@ int main (int argc, char **argv)
+ 		simulator (--argc, ++argv);	/* simulator() does exit() */
+ #endif
+ 
+-	daemon_init(!(run_mode & MODE_NODAEMON));
++	daemon_init((run_mode & MODE_NODAEMON));
+ 
+ 	if (run_mode & MODE_LOG_STDERR) {
+ 		xlog_syslog(0);
diff --git a/nfs-utils.spec b/nfs-utils.spec
index 842ef3d..d85c579 100644
--- a/nfs-utils.spec
+++ b/nfs-utils.spec
@@ -2,7 +2,7 @@ Summary: NFS utilities and supporting clients and daemons for the kernel NFS ser
 Name: nfs-utils
 URL: http://sourceforge.net/projects/nfs
 Version: 1.3.2
-Release: 3%{?dist}
+Release: 4%{?dist}
 Epoch: 1
 
 # group all 32bit related archs
@@ -15,7 +15,7 @@ Source2: nfs.sysconfig
 Source3: nfs-utils_env.sh
 Source4: lockd.conf
 
-Patch001: nfs-utils-1.3.3-rc3.patch
+Patch001: nfs-utils-1.3.3-rc4.patch
 
 Patch100: nfs-utils-1.2.1-statdpath-man.patch
 Patch101: nfs-utils-1.2.1-exp-subtree-warn-off.patch
@@ -305,6 +305,9 @@ fi
 /sbin/umount.nfs4
 
 %changelog
+* Thu May  7 2015 Steve Dickson <steved at redhat.com> 1.3.2-4
+- Update to latest RC release: nfs-utils-1-3-3-rc4
+
 * Mon Apr  6 2015 Steve Dickson <steved at redhat.com> 1.3.2-3
 - Update to latest RC release: nfs-utils-1-3-3-rc3
 
-- 
cgit v0.10.2


	http://pkgs.fedoraproject.org/cgit/nfs-utils.git/commit/?h=master&id=084cf0ad1a8ed944da93cae91887c4592f72062a


More information about the scm-commits mailing list