Updated to the latest RC release: nfs-utils-2-6-2-rc6 (bz 2099697)

Signed-off-by: Steve Dickson <steved@redhat.com>
This commit is contained in:
Steve Dickson 2022-06-23 11:59:36 -04:00
parent d6281e4f6e
commit d789857c8c
4 changed files with 101 additions and 1573 deletions

View File

@ -1,565 +0,0 @@
diff --git a/configure.ac b/configure.ac
index 50e9b32..e0f5a93 100644
--- a/configure.ac
+++ b/configure.ac
@@ -737,6 +737,7 @@ AC_CONFIG_FILES([
tools/rpcgen/Makefile
tools/mountstats/Makefile
tools/nfs-iostat/Makefile
+ tools/rpcctl/Makefile
tools/nfsdclnts/Makefile
tools/nfsconf/Makefile
tools/nfsdclddb/Makefile
diff --git a/support/nfs/rpcdispatch.c b/support/nfs/rpcdispatch.c
index f7c27c9..7329f41 100644
--- a/support/nfs/rpcdispatch.c
+++ b/support/nfs/rpcdispatch.c
@@ -26,12 +26,13 @@ rpc_dispatch(struct svc_req *rqstp, SVCXPRT *transp,
void *argp, void *resp)
{
struct rpc_dentry *dent;
+ int rq_vers = (int)rqstp->rq_vers;
- if (((int)rqstp->rq_vers) > nvers) {
+ if (rq_vers < 1 || rq_vers > nvers) {
svcerr_progvers(transp, 1, nvers);
return;
}
- dtable += (rqstp->rq_vers - 1);
+ dtable += (rq_vers - 1);
if (rqstp->rq_proc > dtable->nproc) {
svcerr_noproc(transp);
return;
diff --git a/support/nfsidmap/idmapd.conf.5 b/support/nfsidmap/idmapd.conf.5
index f5b1816..87e39bb 100644
--- a/support/nfsidmap/idmapd.conf.5
+++ b/support/nfsidmap/idmapd.conf.5
@@ -198,8 +198,8 @@ With this group names of a central directory can be shortened for an isolated or
.TP
.B Group-Name-No-Prefix-Regex
Case-insensitive regular expression to exclude groups from adding and removing the prefix set by
-.B Group-Name-Prefix
-. The regular expression must match both the remote and local group names. Multiple expressions may be concatenated with '|'.
+.BR Group-Name-Prefix .
+The regular expression must match both the remote and local group names. Multiple expressions may be concatenated with '|'.
(Default: none)
.\"
.\" -------------------------------------------------------------------
diff --git a/systemd/nfs.conf.man b/systemd/nfs.conf.man
index 4436a38..be487a1 100644
--- a/systemd/nfs.conf.man
+++ b/systemd/nfs.conf.man
@@ -171,7 +171,6 @@ Recognized values:
.BR lease-time ,
.BR udp ,
.BR tcp ,
-.BR vers2 ,
.BR vers3 ,
.BR vers4 ,
.BR vers4.0 ,
diff --git a/systemd/rpc-pipefs-generator.c b/systemd/rpc-pipefs-generator.c
index c24db56..7b2bb4f 100644
--- a/systemd/rpc-pipefs-generator.c
+++ b/systemd/rpc-pipefs-generator.c
@@ -28,11 +28,12 @@ static int generate_mount_unit(const char *pipefs_path, const char *pipefs_unit,
{
char *path;
FILE *f;
+ size_t size = (strlen(dirname) + 1 + strlen(pipefs_unit));
- path = malloc(strlen(dirname) + 1 + strlen(pipefs_unit));
+ path = malloc(size);
if (!path)
return 1;
- sprintf(path, "%s/%s", dirname, pipefs_unit);
+ snprintf(path, size, "%s/%s", dirname, pipefs_unit);
f = fopen(path, "w");
if (!f)
{
diff --git a/tests/t0001-statd-basic-mon-unmon.sh b/tests/t0001-statd-basic-mon-unmon.sh
index 92517a1..e1065e7 100755
--- a/tests/t0001-statd-basic-mon-unmon.sh
+++ b/tests/t0001-statd-basic-mon-unmon.sh
@@ -21,8 +21,9 @@
. ./test-lib.sh
-# This test needs root privileges
+# This test needs root privileges and /dev/log
check_root
+check_dev_log
start_statd
if [ $? -ne 0 ]; then
diff --git a/tests/test-lib.sh b/tests/test-lib.sh
index e47ad13..b62ac2a 100644
--- a/tests/test-lib.sh
+++ b/tests/test-lib.sh
@@ -37,6 +37,15 @@ check_root() {
fi
}
+# Most tests require /dev/log. Skip the test if it doesn't exist in this
+# environment.
+check_dev_log() {
+ if ! [ -e /dev/log ]; then
+ echo "*** Skipping this tests as it requires /dev/log ***"
+ exit 77
+ fi
+}
+
# is lockd registered as a service?
lockd_registered() {
rpcinfo -p | grep -q nlockmgr
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 9b4b080..c3feabb 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -12,6 +12,6 @@ if CONFIG_NFSDCLD
OPTDIRS += nfsdclddb
endif
-SUBDIRS = locktest rpcdebug nlmtest mountstats nfs-iostat nfsdclnts $(OPTDIRS)
+SUBDIRS = locktest rpcdebug nlmtest mountstats nfs-iostat rpcctl nfsdclnts $(OPTDIRS)
MAINTAINERCLEANFILES = Makefile.in
diff --git a/tools/rpcctl/Makefile.am b/tools/rpcctl/Makefile.am
new file mode 100644
index 0000000..33fb431
--- /dev/null
+++ b/tools/rpcctl/Makefile.am
@@ -0,0 +1,13 @@
+## Process this file with automake to produce Makefile.in
+PYTHON_FILES = rpcctl.py
+
+man8_MANS = rpcctl.man
+
+EXTRA_DIST = $(man8_MANS) $(PYTHON_FILES)
+
+all-local: $(PYTHON_FILES)
+
+install-data-hook:
+ $(INSTALL) -m 755 rpcctl.py $(DESTDIR)$(sbindir)/rpcctl
+
+MAINTAINERCLEANFILES=Makefile.in
diff --git a/tools/rpcctl/rpcctl.man b/tools/rpcctl/rpcctl.man
new file mode 100644
index 0000000..b87ba0d
--- /dev/null
+++ b/tools/rpcctl/rpcctl.man
@@ -0,0 +1,67 @@
+.\"
+.\" rpcctl(8)
+.\"
+.TH rpcctl 8 "15 Feb 2022"
+.SH NAME
+rpcctl \- Displays SunRPC connection information
+.SH SYNOPSIS
+.nf
+.BR rpcctl " [ \fB\-h \fR| \fB\-\-help \fR] { \fBclient \fR| \fBswitch \fR| \fBxprt \fR}"
+.P
+.BR "rpcctl client" " \fR[ \fB\-h \fR| \fB\-\-help \fR] { \fBshow \fR}"
+.BR "rpcctl client show " "\fR[ \fB\-h \f| \fB\-\-help \fR] [ \fIXPRT \fR]"
+.P
+.BR "rpcctl switch" " \fR[ \fB\-h \fR| \fB\-\-help \fR] { \fBset \fR| \fBshow \fR}"
+.BR "rpcctl switch set" " \fR[ \fB\-h \fR| \fB\-\-help \fR] \fISWITCH \fBdstaddr \fINEWADDR"
+.BR "rpcctl switch show" " \fR[ \fB\-h \fR| \fB\-\-help \fR] [ \fISWITCH \fR]"
+.P
+.BR "rpcctl xprt" " \fR[ \fB\-h \fR| \fB\-\-help \fR] { \fBremove \fR| \fBset \fR| \fBshow \fR}"
+.BR "rpcctl xprt remove" " \fR[ \fB\-h \fR| \fB\-\-help \fR] \fIXPRT"
+.BR "rpcctl xprt set" " \fR[ \fB\-h \fR| \fB\-\-help \fR] \fIXPRT \fR{ \fBdstaddr \fINEWADDR \fR| \fBoffline \fR| \fBonline \fR}"
+.BR "rpcctl xprt show" " \fR[ \fB\-h \fR| \fB\-\-help \fR] [ \fIXPRT \fR]"
+.fi
+.SH DESCRIPTION
+.RB "The " rpcctl " command displays information collected in the SunRPC sysfs files about the system's SunRPC objects.
+.P
+.SS rpcctl client \fR- \fBCommands operating on RPC clients
+.IP "\fBshow \fR[ \fICLIENT \fR] \fB(default)"
+Show detailed information about the RPC clients on this system.
+If \fICLIENT \fRwas provided, then only show information about a single RPC client.
+.P
+.SS rpcctl switch \fR- \fBCommands operating on groups of transports
+.IP "\fBset \fISWITCH \fBdstaddr \fINEWADDR"
+Change the destination address of all transports in the \fISWITCH \fRto \fINEWADDR\fR.
+\fINEWADDR \fRcan be an IP address, DNS name, or anything else resolvable by \fBgethostbyname\fR(3).
+.IP "\fBshow \fR[ \fISWITCH \fR] \fB(default)"
+Show detailed information about groups of transports on this system.
+If \fISWITCH \fRwas provided, then only show information about a single transport group.
+.P
+.SS rpcctl xprt \fR- \fBCommands operating on individual transports
+.IP "\fBremove \fIXPRT"
+Removes the specified \fIXPRT \fRfrom the system.
+Note that "main" transports cannot be removed.
+.P
+.IP "\fBset \fIXPRT \fBdstaddr \fINEWADDR"
+Change the destination address of the specified \fIXPRT \fR to \fINEWADDR\fR.
+\fINEWADDR \fRcan be an IP address, DNS name, or anything else resolvable by \fBgethostbyname\fR(3).
+.P
+.IP "\fBset \fIXPRT \fBoffline"
+Sets the specified \fIXPRT\fR's state to offline.
+.P
+.IP "\fBset \fIXPRT \fBonline"
+Sets the specified \fIXPRT\fR's state to online.
+.IP "\fBshow \fR[ \fIXPRT \fR] \fB(default)"
+Show detailed information about this system's transports.
+If \fIXPRT \fRwas provided, then only show information about a single transport.
+.SH EXAMPLES
+.IP "\fBrpcctl switch show switch-2"
+Show details about the RPC switch named "switch-2".
+.IP "\fBrpcctl xprt remove xprt-4"
+Remove the xprt named "xprt-4" from the system.
+.IP "\fBrpcctl xprt set xprt-3 dstaddr https://linux-nfs.org
+Change the dstaddr of the xprt named "xprt-3" to point to linux-nfs.org
+.SH DIRECTORY
+.TP
+.B /sys/kernel/sunrpc/
+.SH AUTHOR
+Anna Schumaker <Anna.Schumaker@Netapp.com>
diff --git a/tools/rpcctl/rpcctl.py b/tools/rpcctl/rpcctl.py
new file mode 100755
index 0000000..b8df556
--- /dev/null
+++ b/tools/rpcctl/rpcctl.py
@@ -0,0 +1,255 @@
+#!/usr/bin/python3
+import argparse
+import collections
+import errno
+import os
+import pathlib
+import socket
+import sys
+
+with open("/proc/mounts", 'r') as f:
+ mount = [ line.split()[1] for line in f if "sysfs" in line ]
+ if len(mount) == 0:
+ print("ERROR: sysfs is not mounted")
+ sys.exit(1)
+
+sunrpc = pathlib.Path(mount[0]) / "kernel" / "sunrpc"
+if not sunrpc.is_dir():
+ print("ERROR: sysfs does not have sunrpc directory")
+ sys.exit(1)
+
+def read_addr_file(path):
+ try:
+ with open(path, 'r') as f:
+ return f.readline().strip()
+ except:
+ return "(enoent)"
+
+def write_addr_file(path, newaddr):
+ with open(path, 'w') as f:
+ f.write(newaddr)
+ return read_addr_file(path)
+
+def read_info_file(path):
+ res = collections.defaultdict(int)
+ try:
+ with open(path) as info:
+ lines = [ l.split("=", 1) for l in info if "=" in l ]
+ res.update({ key:int(val.strip()) for (key, val) in lines })
+ finally:
+ return res
+
+
+class Xprt:
+ def __init__(self, path):
+ self.path = path
+ self.name = path.stem.rsplit("-", 1)[0]
+ self.type = path.stem.split("-")[2]
+ self.info = read_info_file(path / "xprt_info")
+ self.dstaddr = read_addr_file(path / "dstaddr")
+ self.srcaddr = read_addr_file(path / "srcaddr")
+ self.read_state()
+
+ def __lt__(self, rhs):
+ return self.name < rhs.name
+
+ def _xprt(self):
+ main = ", main" if self.info.get("main_xprt") else ""
+ return f"{self.name}: {self.type}, {self.dstaddr}, " \
+ f"port {self.info['dst_port']}, state <{self.state}>{main}"
+
+ def _src_reqs(self):
+ return f" Source: {self.srcaddr}, port {self.info['src_port']}, " \
+ f"Requests: {self.info['num_reqs']}"
+
+ def _cong_slots(self):
+ return f" Congestion: cur {self.info['cur_cong']}, win {self.info['cong_win']}, " \
+ f"Slots: min {self.info['min_num_slots']}, max {self.info['max_num_slots']}"
+
+ def _queues(self):
+ return f" Queues: binding {self.info['binding_q_len']}, " \
+ f"sending {self.info['sending_q_len']}, pending {self.info['pending_q_len']}, " \
+ f"backlog {self.info['backlog_q_len']}, tasks {self.info['tasks_queuelen']}"
+
+ def __str__(self):
+ if not self.path.exists():
+ return f"{self.name}: has been removed"
+ return "\n".join([self._xprt(), self._src_reqs(),
+ self._cong_slots(), self._queues() ])
+
+ def read_state(self):
+ if self.path.exists():
+ with open(self.path / "xprt_state") as f:
+ self.state = ','.join(f.readline().split()[1:])
+
+ def small_str(self):
+ main = " [main]" if self.info.get("main_xprt") else ""
+ return f"{self.name}: {self.type}, {self.dstaddr}{main}"
+
+ def set_dstaddr(self, newaddr):
+ self.dstaddr = write_addr_file(self.path / "dstaddr", newaddr)
+
+ def set_state(self, state):
+ with open(self.path / "xprt_state", 'w') as f:
+ f.write(state)
+ self.read_state()
+
+ def add_command(subparser):
+ parser = subparser.add_parser("xprt", help="Commands for individual xprts")
+ parser.set_defaults(func=Xprt.show, xprt=None)
+ subparser = parser.add_subparsers()
+
+ remove = subparser.add_parser("remove", help="Remove an xprt")
+ remove.add_argument("xprt", metavar="XPRT", nargs=1,
+ help="Name of the xprt to remove")
+ remove.set_defaults(func=Xprt.set_property, property="remove")
+
+ show = subparser.add_parser("show", help="Show xprts")
+ show.add_argument("xprt", metavar="XPRT", nargs='?',
+ help="Name of a specific xprt to show")
+ show.set_defaults(func=Xprt.show)
+
+ set = subparser.add_parser("set", help="Change an xprt property")
+ set.add_argument("xprt", metavar="XPRT", nargs=1,
+ help="Name of a specific xprt to modify")
+ subparser = set.add_subparsers(required=True)
+ online = subparser.add_parser("online", help="Set an xprt online")
+ online.set_defaults(func=Xprt.set_property, property="online")
+ offline = subparser.add_parser("offline", help="Set an xprt offline")
+ offline.set_defaults(func=Xprt.set_property, property="offline")
+ dstaddr = subparser.add_parser("dstaddr", help="Change an xprt's dstaddr")
+ dstaddr.add_argument("newaddr", metavar="NEWADDR", nargs=1,
+ help="The new address for the xprt")
+ dstaddr.set_defaults(func=Xprt.set_property, property="dstaddr")
+
+ def get_by_name(name):
+ glob = f"**/{name}-*" if name else "**/xprt-*"
+ res = [ Xprt(x) for x in (sunrpc / "xprt-switches").glob(glob) ]
+ if name and len(res) == 0:
+ raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT),
+ f"{sunrpc / 'xprt-switches' / glob}")
+ return sorted(res)
+
+ def show(args):
+ for xprt in Xprt.get_by_name(args.xprt):
+ print(xprt)
+
+ def set_property(args):
+ for xprt in Xprt.get_by_name(args.xprt[0]):
+ if args.property == "dstaddr":
+ xprt.set_dstaddr(socket.gethostbyname(args.newaddr[0]))
+ elif args.property == "remove":
+ xprt.set_state("offline")
+ xprt.set_state("remove")
+ else:
+ args.set_state(args.property)
+ print(xprt)
+
+
+class XprtSwitch:
+ def __init__(self, path, sep=":"):
+ self.path = path
+ self.name = path.stem
+ self.info = read_info_file(path / "xprt_switch_info")
+ self.xprts = sorted([ Xprt(p) for p in self.path.iterdir() if p.is_dir() ])
+ self.sep = sep
+
+ def __lt__(self, rhs):
+ return self.name < rhs.name
+
+ def __str__(self):
+ switch = f"{self.name}{self.sep} " \
+ f"xprts {self.info['num_xprts']}, " \
+ f"active {self.info['num_active']}, " \
+ f"queue {self.info['queue_len']}"
+ xprts = [ f" {x.small_str()}" for x in self.xprts ]
+ return "\n".join([ switch ] + xprts)
+
+ def add_command(subparser):
+ parser = subparser.add_parser("switch", help="Commands for xprt switches")
+ parser.set_defaults(func=XprtSwitch.show, switch=None)
+ subparser = parser.add_subparsers()
+
+ show = subparser.add_parser("show", help="Show xprt switches")
+ show.add_argument("switch", metavar="SWITCH", nargs='?',
+ help="Name of a specific switch to show")
+ show.set_defaults(func=XprtSwitch.show)
+
+ set = subparser.add_parser("set", help="Change an xprt switch property")
+ set.add_argument("switch", metavar="SWITCH", nargs=1,
+ help="Name of a specific xprt switch to modify")
+ subparser = set.add_subparsers(required=True)
+ dstaddr = subparser.add_parser("dstaddr", help="Change an xprt switch's dstaddr")
+ dstaddr.add_argument("newaddr", metavar="NEWADDR", nargs=1,
+ help="The new address for the xprt switch")
+ dstaddr.set_defaults(func=XprtSwitch.set_property, property="dstaddr")
+
+ def get_by_name(name):
+ xprt_switches = sunrpc / "xprt-switches"
+ if name:
+ return [ XprtSwitch(xprt_switches / name) ]
+ return [ XprtSwitch(f) for f in sorted(xprt_switches.iterdir()) ]
+
+ def show(args):
+ for switch in XprtSwitch.get_by_name(args.switch):
+ print(switch)
+
+ def set_property(args):
+ for switch in XprtSwitch.get_by_name(args.switch[0]):
+ resolved = socket.gethostbyname(args.newaddr[0])
+ for xprt in switch.xprts:
+ xprt.set_dstaddr(resolved)
+ print(switch)
+
+
+class RpcClient:
+ def __init__(self, path):
+ self.path = path
+ self.name = path.stem
+ self.switch = XprtSwitch(path / (path / "switch").readlink(), sep=",")
+
+ def __lt__(self, rhs):
+ return self.name < rhs.name
+
+ def __str__(self):
+ return f"{self.name}: {self.switch}"
+
+ def add_command(subparser):
+ parser = subparser.add_parser("client", help="Commands for rpc clients")
+ parser.set_defaults(func=RpcClient.show, client=None)
+ subparser = parser.add_subparsers()
+
+ show = subparser.add_parser("show", help="Show rpc clients")
+ show.add_argument("client", metavar="CLIENT", nargs='?',
+ help="Name of a specific rpc client to show")
+ parser.set_defaults(func=RpcClient.show)
+
+ def get_by_name(name):
+ rpc_clients = sunrpc / "rpc-clients"
+ if name:
+ return [ RpcClient(rpc_clients / name) ]
+ return [ RpcClient(f) for f in sorted(rpc_clients.iterdir()) ]
+
+ def show(args):
+ for client in RpcClient.get_by_name(args.client):
+ print(client)
+
+
+parser = argparse.ArgumentParser()
+
+def show_small_help(args):
+ parser.print_usage()
+ print("sunrpc dir:", sunrpc)
+parser.set_defaults(func=show_small_help)
+
+subparser = parser.add_subparsers(title="commands")
+RpcClient.add_command(subparser)
+XprtSwitch.add_command(subparser)
+Xprt.add_command(subparser)
+
+args = parser.parse_args()
+try:
+ args.func(args)
+except Exception as e:
+ print(str(e))
+ sys.exit(1)
diff --git a/utils/idmapd/idmapd.c b/utils/idmapd/idmapd.c
index e2c160e..e79c124 100644
--- a/utils/idmapd/idmapd.c
+++ b/utils/idmapd/idmapd.c
@@ -474,7 +474,7 @@ main(int argc, char **argv)
event_free(svrdirev);
event_base_free(evbase);
- return 1;
+ return 0;
}
static void
diff --git a/utils/idmapd/idmapd.man b/utils/idmapd/idmapd.man
index 5f34d2b..8215d25 100644
--- a/utils/idmapd/idmapd.man
+++ b/utils/idmapd/idmapd.man
@@ -24,13 +24,13 @@ the NFSv4 kernel client and server, to which it communicates via
upcalls, by translating user and group IDs to names, and vice versa.
.Pp
The system derives the
-.I user
+.Em user
part of the string by performing a password or group lookup.
The lookup mechanism is configured in
.Pa /etc/idmapd.conf
.Pp
By default, the
-.I domain
+.Em domain
part of the string is the system's DNS domain name.
It can also be specified in
.Pa /etc/idmapd.conf
diff --git a/utils/mount/nfsmount.conf.man b/utils/mount/nfsmount.conf.man
index 73c3e11..34879c8 100644
--- a/utils/mount/nfsmount.conf.man
+++ b/utils/mount/nfsmount.conf.man
@@ -1,4 +1,4 @@
-."@(#)nfsmount.conf.5"
+.\" @(#)nfsmount.conf.5"
.TH NFSMOUNT.CONF 5 "16 December 2020"
.SH NAME
nfsmount.conf - Configuration file for NFS mounts
diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c
index 3c4e218..dbdd11e 100644
--- a/utils/mount/stropts.c
+++ b/utils/mount/stropts.c
@@ -973,7 +973,9 @@ fall_back:
if ((result = nfs_try_mount_v3v2(mi, FALSE)))
return result;
- errno = olderrno;
+ if (errno != EBUSY && errno != EACCES)
+ errno = olderrno;
+
return result;
}
diff --git a/utils/mountd/mountd.man b/utils/mountd/mountd.man
index 77e6299..a206a3e 100644
--- a/utils/mountd/mountd.man
+++ b/utils/mountd/mountd.man
@@ -286,10 +286,9 @@ The values recognized in the
section include
.BR TCP ,
.BR UDP ,
-.BR vers2 ,
.BR vers3 ", and"
.B vers4
-which each have same same meaning as given by
+which each have the same meaning as given by
.BR rpc.nfsd (8).
.SH TCP_WRAPPERS SUPPORT
diff --git a/utils/nfsd/nfsd.man b/utils/nfsd/nfsd.man
index 716f538..634b8a6 100644
--- a/utils/nfsd/nfsd.man
+++ b/utils/nfsd/nfsd.man
@@ -156,8 +156,6 @@ Enable (with "on" or "yes" etc) or disable ("off", "no") UDP support.
.B TCP
Enable or disable TCP support.
.TP
-.B vers2
-.TP
.B vers3
.TP
.B vers4

View File

@ -1,971 +0,0 @@
diff --git a/.gitignore b/.gitignore
index c89d1cd..df791a8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -61,6 +61,8 @@ utils/statd/statd
tools/locktest/testlk
tools/getiversion/getiversion
tools/nfsconf/nfsconf
+tools/nfsrahead/nfsrahead
+tools/nfsrahead/99-nfs_bdi.rules
support/export/mount.h
support/export/mount_clnt.c
support/export/mount_xdr.c
diff --git a/configure.ac b/configure.ac
index 50e9b32..3e1c183 100644
--- a/configure.ac
+++ b/configure.ac
@@ -737,6 +737,8 @@ AC_CONFIG_FILES([
tools/rpcgen/Makefile
tools/mountstats/Makefile
tools/nfs-iostat/Makefile
+ tools/nfsrahead/Makefile
+ tools/rpcctl/Makefile
tools/nfsdclnts/Makefile
tools/nfsconf/Makefile
tools/nfsdclddb/Makefile
diff --git a/nfs.conf b/nfs.conf
index 21d3e7b..323f072 100644
--- a/nfs.conf
+++ b/nfs.conf
@@ -5,6 +5,10 @@
[general]
# pipefs-directory=/var/lib/nfs/rpc_pipefs
#
+[nfsrahead]
+# nfs=15000
+# nfs4=16000
+#
[exports]
# rootdir=/export
#
diff --git a/support/export/v4clients.c b/support/export/v4clients.c
index 5e4f105..5f15b61 100644
--- a/support/export/v4clients.c
+++ b/support/export/v4clients.c
@@ -8,9 +8,9 @@
#include <unistd.h>
#include <stdlib.h>
#include <sys/inotify.h>
+#include <sys/stat.h>
#include <errno.h>
#include "export.h"
-#include "version.h"
/* search.h declares 'struct entry' and nfs_prot.h
* does too. Easiest fix is to trick search.h into
@@ -24,7 +24,10 @@ static int clients_fd = -1;
void v4clients_init(void)
{
- if (linux_version_code() < MAKE_VERSION(5, 3, 0))
+ struct stat sb;
+
+ if (!stat("/proc/fs/nfsd/clients", &sb) == 0 ||
+ !S_ISDIR(sb.st_mode))
return;
if (clients_fd >= 0)
return;
diff --git a/support/nfs/rpcdispatch.c b/support/nfs/rpcdispatch.c
index f7c27c9..7329f41 100644
--- a/support/nfs/rpcdispatch.c
+++ b/support/nfs/rpcdispatch.c
@@ -26,12 +26,13 @@ rpc_dispatch(struct svc_req *rqstp, SVCXPRT *transp,
void *argp, void *resp)
{
struct rpc_dentry *dent;
+ int rq_vers = (int)rqstp->rq_vers;
- if (((int)rqstp->rq_vers) > nvers) {
+ if (rq_vers < 1 || rq_vers > nvers) {
svcerr_progvers(transp, 1, nvers);
return;
}
- dtable += (rqstp->rq_vers - 1);
+ dtable += (rq_vers - 1);
if (rqstp->rq_proc > dtable->nproc) {
svcerr_noproc(transp);
return;
diff --git a/support/nfsidmap/idmapd.conf.5 b/support/nfsidmap/idmapd.conf.5
index f5b1816..87e39bb 100644
--- a/support/nfsidmap/idmapd.conf.5
+++ b/support/nfsidmap/idmapd.conf.5
@@ -198,8 +198,8 @@ With this group names of a central directory can be shortened for an isolated or
.TP
.B Group-Name-No-Prefix-Regex
Case-insensitive regular expression to exclude groups from adding and removing the prefix set by
-.B Group-Name-Prefix
-. The regular expression must match both the remote and local group names. Multiple expressions may be concatenated with '|'.
+.BR Group-Name-Prefix .
+The regular expression must match both the remote and local group names. Multiple expressions may be concatenated with '|'.
(Default: none)
.\"
.\" -------------------------------------------------------------------
diff --git a/systemd/nfs.conf.man b/systemd/nfs.conf.man
index 4436a38..e74083e 100644
--- a/systemd/nfs.conf.man
+++ b/systemd/nfs.conf.man
@@ -171,7 +171,6 @@ Recognized values:
.BR lease-time ,
.BR udp ,
.BR tcp ,
-.BR vers2 ,
.BR vers3 ,
.BR vers4 ,
.BR vers4.0 ,
@@ -295,6 +294,17 @@ Only
.B debug=
is recognized.
+.TP
+.B nfsrahead
+Recognized values:
+.BR nfs ,
+.BR nfsv4 ,
+.BR default .
+
+See
+.BR nfsrahead (5)
+for deatils.
+
.SH FILES
.TP 10n
.I /etc/nfs.conf
diff --git a/systemd/rpc-pipefs-generator.c b/systemd/rpc-pipefs-generator.c
index c24db56..7b2bb4f 100644
--- a/systemd/rpc-pipefs-generator.c
+++ b/systemd/rpc-pipefs-generator.c
@@ -28,11 +28,12 @@ static int generate_mount_unit(const char *pipefs_path, const char *pipefs_unit,
{
char *path;
FILE *f;
+ size_t size = (strlen(dirname) + 1 + strlen(pipefs_unit));
- path = malloc(strlen(dirname) + 1 + strlen(pipefs_unit));
+ path = malloc(size);
if (!path)
return 1;
- sprintf(path, "%s/%s", dirname, pipefs_unit);
+ snprintf(path, size, "%s/%s", dirname, pipefs_unit);
f = fopen(path, "w");
if (!f)
{
diff --git a/tests/t0001-statd-basic-mon-unmon.sh b/tests/t0001-statd-basic-mon-unmon.sh
index 92517a1..e1065e7 100755
--- a/tests/t0001-statd-basic-mon-unmon.sh
+++ b/tests/t0001-statd-basic-mon-unmon.sh
@@ -21,8 +21,9 @@
. ./test-lib.sh
-# This test needs root privileges
+# This test needs root privileges and /dev/log
check_root
+check_dev_log
start_statd
if [ $? -ne 0 ]; then
diff --git a/tests/test-lib.sh b/tests/test-lib.sh
index e47ad13..b62ac2a 100644
--- a/tests/test-lib.sh
+++ b/tests/test-lib.sh
@@ -37,6 +37,15 @@ check_root() {
fi
}
+# Most tests require /dev/log. Skip the test if it doesn't exist in this
+# environment.
+check_dev_log() {
+ if ! [ -e /dev/log ]; then
+ echo "*** Skipping this tests as it requires /dev/log ***"
+ exit 77
+ fi
+}
+
# is lockd registered as a service?
lockd_registered() {
rpcinfo -p | grep -q nlockmgr
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 9b4b080..40c17c3 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -12,6 +12,6 @@ if CONFIG_NFSDCLD
OPTDIRS += nfsdclddb
endif
-SUBDIRS = locktest rpcdebug nlmtest mountstats nfs-iostat nfsdclnts $(OPTDIRS)
+SUBDIRS = locktest rpcdebug nlmtest mountstats nfs-iostat rpcctl nfsdclnts nfsrahead $(OPTDIRS)
MAINTAINERCLEANFILES = Makefile.in
diff --git a/tools/nfsrahead/99-nfs.rules b/tools/nfsrahead/99-nfs.rules
new file mode 100644
index 0000000..c74914b
--- /dev/null
+++ b/tools/nfsrahead/99-nfs.rules
@@ -0,0 +1 @@
+SUBSYSTEM=="bdi", ACTION=="add", PROGRAM="/usr/libexec/nfsrahead %k", ATTR{read_ahead_kb}="%c"
diff --git a/tools/nfsrahead/99-nfs.rules.in b/tools/nfsrahead/99-nfs.rules.in
new file mode 100644
index 0000000..648813c
--- /dev/null
+++ b/tools/nfsrahead/99-nfs.rules.in
@@ -0,0 +1 @@
+SUBSYSTEM=="bdi", ACTION=="add", PROGRAM="_libexecdir_/nfsrahead %k", ATTR{read_ahead_kb}="%c"
diff --git a/tools/nfsrahead/Makefile.am b/tools/nfsrahead/Makefile.am
new file mode 100644
index 0000000..845ea0d
--- /dev/null
+++ b/tools/nfsrahead/Makefile.am
@@ -0,0 +1,16 @@
+libexec_PROGRAMS = nfsrahead
+nfsrahead_SOURCES = main.c
+nfsrahead_LDFLAGS= -lmount
+nfsrahead_LDADD = ../../support/nfs/libnfsconf.la
+
+man5_MANS = nfsrahead.man
+EXTRA_DIST = $(man5_MANS)
+
+udev_rulesdir = /usr/lib/udev/rules.d/
+udev_rules_DATA = 99-nfs.rules
+
+99-nfs.rules: 99-nfs.rules.in $(builddefs)
+ $(SED) "s|_libexecdir_|@libexecdir@|g" 99-nfs.rules.in > $@
+
+clean-local:
+ $(RM) 99-nfs.rules
diff --git a/tools/nfsrahead/main.c b/tools/nfsrahead/main.c
new file mode 100644
index 0000000..c83c6f7
--- /dev/null
+++ b/tools/nfsrahead/main.c
@@ -0,0 +1,192 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <unistd.h>
+
+#include <libmount/libmount.h>
+#include <sys/sysmacros.h>
+
+#include "xlog.h"
+#include "conffile.h"
+
+#ifndef MOUNTINFO_PATH
+#define MOUNTINFO_PATH "/proc/self/mountinfo"
+#endif
+
+#define CONF_NAME "nfsrahead"
+#define NFS_DEFAULT_READAHEAD 128
+
+/* Device information from the system */
+struct device_info {
+ char *device_number;
+ dev_t dev;
+ char *mountpoint;
+ char *fstype;
+};
+
+/* Convert a string in the format n:m to a device number */
+static int fill_device_number(struct device_info *info)
+{
+ char *s = strdup(info->device_number), *p;
+ char *maj_s, *min_s;
+ unsigned int maj, min;
+ int err = -EINVAL;
+
+ maj_s = p = s;
+ for ( ; *p != ':' && *p != '\0'; p++)
+ ;
+
+ if (*p == '\0')
+ goto out_free;
+
+ err = 0;
+ *p = '\0';
+ min_s = p + 1;
+
+ maj = strtol(maj_s, NULL, 10);
+ min = strtol(min_s, NULL, 10);
+
+ info->dev = makedev(maj, min);
+out_free:
+ free(s);
+ return err;
+}
+
+#define sfree(ptr) if (ptr) free(ptr)
+
+/* device_info maintenance */
+static void init_device_info(struct device_info *di, const char *device_number)
+{
+ di->device_number = strdup(device_number);
+ di->dev = 0;
+ di->mountpoint = NULL;
+ di->fstype = NULL;
+}
+
+
+static void free_device_info(struct device_info *di)
+{
+ sfree(di->mountpoint);
+ sfree(di->fstype);
+ sfree(di->device_number);
+}
+
+static int get_mountinfo(const char *device_number, struct device_info *device_info, const char *mountinfo_path)
+{
+ int ret = 0;
+ struct libmnt_table *mnttbl;
+ struct libmnt_fs *fs;
+ char *target;
+
+ init_device_info(device_info, device_number);
+ if ((ret = fill_device_number(device_info)) < 0)
+ goto out_free_device_info;
+
+ mnttbl = mnt_new_table();
+
+ if ((ret = mnt_table_parse_file(mnttbl, mountinfo_path)) < 0) {
+ xlog(D_GENERAL, "Failed to parse %s\n", mountinfo_path);
+ goto out_free_tbl;
+ }
+
+ if ((fs = mnt_table_find_devno(mnttbl, device_info->dev, MNT_ITER_FORWARD)) == NULL) {
+ ret = ENOENT;
+ goto out_free_tbl;
+ }
+
+ if ((target = (char *)mnt_fs_get_target(fs)) == NULL) {
+ ret = ENOENT;
+ goto out_free_fs;
+ }
+
+ device_info->mountpoint = strdup(target);
+ target = (char *)mnt_fs_get_fstype(fs);
+ if (target)
+ device_info->fstype = strdup(target);
+
+out_free_fs:
+ mnt_free_fs(fs);
+out_free_tbl:
+ mnt_free_table(mnttbl);
+out_free_device_info:
+ free(device_info->device_number);
+ device_info->device_number = NULL;
+ return ret;
+}
+
+static int get_device_info(const char *device_number, struct device_info *device_info)
+{
+ int ret = ENOENT;
+ for (int retry_count = 0; retry_count < 10 && ret != 0; retry_count++)
+ ret = get_mountinfo(device_number, device_info, MOUNTINFO_PATH);
+
+ return ret;
+}
+
+static int conf_get_readahead(const char *kind) {
+ int readahead = 0;
+
+ if((readahead = conf_get_num(CONF_NAME, kind, -1)) == -1)
+ readahead = conf_get_num(CONF_NAME, "default", NFS_DEFAULT_READAHEAD);
+
+ return readahead;
+}
+
+int main(int argc, char **argv)
+{
+ int ret = 0, retry, opt;
+ struct device_info device;
+ unsigned int readahead = 128, log_level, log_stderr = 0;
+
+
+ log_level = D_ALL & ~D_GENERAL;
+ while((opt = getopt(argc, argv, "dF")) != -1) {
+ switch (opt) {
+ case 'd':
+ log_level = D_ALL;
+ break;
+ case 'F':
+ log_stderr = 1;
+ break;
+ }
+ }
+
+ conf_init_file(NFS_CONFFILE);
+
+ xlog_stderr(log_stderr);
+ xlog_syslog(~log_stderr);
+ xlog_config(log_level, 1);
+ xlog_open(CONF_NAME);
+
+ // xlog_err causes the system to exit
+ if ((argc - optind) != 1)
+ xlog_err("expected the device number of a BDI; is udev ok?");
+
+ for (retry = 0; retry <= 10; retry++ )
+ if ((ret = get_device_info(argv[optind], &device)) == 0)
+ break;
+
+ if (ret != 0) {
+ xlog(D_GENERAL, "unable to find device %s\n", argv[optind]);
+ goto out;
+ }
+
+ if (strncmp("nfs", device.fstype, 3) != 0) {
+ xlog(D_GENERAL,
+ "not setting readahead for non supported fstype %s on device %s\n",
+ device.fstype, argv[optind]);
+ ret = -EINVAL;
+ goto out;
+ }
+
+ readahead = conf_get_readahead(device.fstype);
+
+ xlog(D_FAC7, "setting %s readahead to %d\n", device.mountpoint, readahead);
+
+ printf("%d\n", readahead);
+
+out:
+ free_device_info(&device);
+ return ret;
+}
diff --git a/tools/nfsrahead/nfsrahead.man b/tools/nfsrahead/nfsrahead.man
new file mode 100644
index 0000000..5488f63
--- /dev/null
+++ b/tools/nfsrahead/nfsrahead.man
@@ -0,0 +1,72 @@
+.\" Manpage for nfsrahead.
+.nh
+.ad l
+.TH man 5 "08 Mar 2022" "1.0" "nfsrahead man page"
+.SH NAME
+
+nfsrahead \- Configure the readahead for NFS mounts
+
+.SH SYNOPSIS
+
+nfsrahead [-F] [-d] <device>
+
+.SH DESCRIPTION
+
+\fInfsrahead\fR is a tool intended to be used with udev to set the \fIread_ahead_kb\fR parameter of NFS mounts, according to the configuration file (see \fICONFIGURATION\fR). \fIdevice\fR is the device number for the NFS backing device as provided by the kernel.
+
+.SH OPTIONS
+.TP
+.B -F
+Send messages to
+.I stderr
+instead of
+.I syslog
+
+.TP
+.B -d
+Increase the debugging level.
+
+.SH CONFIGURATION
+.I nfsrahead
+is configured in
+.IR /etc/nfs.conf ,
+in the section titled
+.IR nfsrahead .
+It accepts the following configurations.
+
+.TP
+.B nfs=<value>
+The readahead value applied to NFSv3 mounts.
+
+.TP
+.B nfs4=<value>
+The readahead value applied to NFSv4 mounts.
+
+.TP
+.B default=<value>
+The default configuration when none of the configurations above is set.
+
+.SH EXAMPLE CONFIGURATION
+[nfsrahead]
+.br
+nfs=15000 # readahead of 15000 for NFSv3 mounts
+.br
+nfs4=16000 # readahead of 16000 for NFSv4 mounts
+.br
+default=128 # default is 128
+
+.SH SEE ALSO
+
+.BR mount.nfs (8),
+.BR nfs (5),
+.BR nfs.conf (5),
+.BR udev (7),
+.BR bcc-readahead (8)
+
+.SH BUGS
+
+No known bugs.
+
+.SH AUTHOR
+
+Thiago Rafael Becker <trbecker@gmail.com>
diff --git a/tools/rpcctl/Makefile.am b/tools/rpcctl/Makefile.am
new file mode 100644
index 0000000..33fb431
--- /dev/null
+++ b/tools/rpcctl/Makefile.am
@@ -0,0 +1,13 @@
+## Process this file with automake to produce Makefile.in
+PYTHON_FILES = rpcctl.py
+
+man8_MANS = rpcctl.man
+
+EXTRA_DIST = $(man8_MANS) $(PYTHON_FILES)
+
+all-local: $(PYTHON_FILES)
+
+install-data-hook:
+ $(INSTALL) -m 755 rpcctl.py $(DESTDIR)$(sbindir)/rpcctl
+
+MAINTAINERCLEANFILES=Makefile.in
diff --git a/tools/rpcctl/rpcctl.man b/tools/rpcctl/rpcctl.man
new file mode 100644
index 0000000..b87ba0d
--- /dev/null
+++ b/tools/rpcctl/rpcctl.man
@@ -0,0 +1,67 @@
+.\"
+.\" rpcctl(8)
+.\"
+.TH rpcctl 8 "15 Feb 2022"
+.SH NAME
+rpcctl \- Displays SunRPC connection information
+.SH SYNOPSIS
+.nf
+.BR rpcctl " [ \fB\-h \fR| \fB\-\-help \fR] { \fBclient \fR| \fBswitch \fR| \fBxprt \fR}"
+.P
+.BR "rpcctl client" " \fR[ \fB\-h \fR| \fB\-\-help \fR] { \fBshow \fR}"
+.BR "rpcctl client show " "\fR[ \fB\-h \f| \fB\-\-help \fR] [ \fIXPRT \fR]"
+.P
+.BR "rpcctl switch" " \fR[ \fB\-h \fR| \fB\-\-help \fR] { \fBset \fR| \fBshow \fR}"
+.BR "rpcctl switch set" " \fR[ \fB\-h \fR| \fB\-\-help \fR] \fISWITCH \fBdstaddr \fINEWADDR"
+.BR "rpcctl switch show" " \fR[ \fB\-h \fR| \fB\-\-help \fR] [ \fISWITCH \fR]"
+.P
+.BR "rpcctl xprt" " \fR[ \fB\-h \fR| \fB\-\-help \fR] { \fBremove \fR| \fBset \fR| \fBshow \fR}"
+.BR "rpcctl xprt remove" " \fR[ \fB\-h \fR| \fB\-\-help \fR] \fIXPRT"
+.BR "rpcctl xprt set" " \fR[ \fB\-h \fR| \fB\-\-help \fR] \fIXPRT \fR{ \fBdstaddr \fINEWADDR \fR| \fBoffline \fR| \fBonline \fR}"
+.BR "rpcctl xprt show" " \fR[ \fB\-h \fR| \fB\-\-help \fR] [ \fIXPRT \fR]"
+.fi
+.SH DESCRIPTION
+.RB "The " rpcctl " command displays information collected in the SunRPC sysfs files about the system's SunRPC objects.
+.P
+.SS rpcctl client \fR- \fBCommands operating on RPC clients
+.IP "\fBshow \fR[ \fICLIENT \fR] \fB(default)"
+Show detailed information about the RPC clients on this system.
+If \fICLIENT \fRwas provided, then only show information about a single RPC client.
+.P
+.SS rpcctl switch \fR- \fBCommands operating on groups of transports
+.IP "\fBset \fISWITCH \fBdstaddr \fINEWADDR"
+Change the destination address of all transports in the \fISWITCH \fRto \fINEWADDR\fR.
+\fINEWADDR \fRcan be an IP address, DNS name, or anything else resolvable by \fBgethostbyname\fR(3).
+.IP "\fBshow \fR[ \fISWITCH \fR] \fB(default)"
+Show detailed information about groups of transports on this system.
+If \fISWITCH \fRwas provided, then only show information about a single transport group.
+.P
+.SS rpcctl xprt \fR- \fBCommands operating on individual transports
+.IP "\fBremove \fIXPRT"
+Removes the specified \fIXPRT \fRfrom the system.
+Note that "main" transports cannot be removed.
+.P
+.IP "\fBset \fIXPRT \fBdstaddr \fINEWADDR"
+Change the destination address of the specified \fIXPRT \fR to \fINEWADDR\fR.
+\fINEWADDR \fRcan be an IP address, DNS name, or anything else resolvable by \fBgethostbyname\fR(3).
+.P
+.IP "\fBset \fIXPRT \fBoffline"
+Sets the specified \fIXPRT\fR's state to offline.
+.P
+.IP "\fBset \fIXPRT \fBonline"
+Sets the specified \fIXPRT\fR's state to online.
+.IP "\fBshow \fR[ \fIXPRT \fR] \fB(default)"
+Show detailed information about this system's transports.
+If \fIXPRT \fRwas provided, then only show information about a single transport.
+.SH EXAMPLES
+.IP "\fBrpcctl switch show switch-2"
+Show details about the RPC switch named "switch-2".
+.IP "\fBrpcctl xprt remove xprt-4"
+Remove the xprt named "xprt-4" from the system.
+.IP "\fBrpcctl xprt set xprt-3 dstaddr https://linux-nfs.org
+Change the dstaddr of the xprt named "xprt-3" to point to linux-nfs.org
+.SH DIRECTORY
+.TP
+.B /sys/kernel/sunrpc/
+.SH AUTHOR
+Anna Schumaker <Anna.Schumaker@Netapp.com>
diff --git a/tools/rpcctl/rpcctl.py b/tools/rpcctl/rpcctl.py
new file mode 100755
index 0000000..d2110ad
--- /dev/null
+++ b/tools/rpcctl/rpcctl.py
@@ -0,0 +1,262 @@
+#!/usr/bin/python3
+import argparse
+import collections
+import errno
+import os
+import pathlib
+import socket
+import sys
+
+with open("/proc/mounts", 'r') as f:
+ mount = [ line.split()[1] for line in f if "sysfs" in line ]
+ if len(mount) == 0:
+ print("ERROR: sysfs is not mounted")
+ sys.exit(1)
+
+sunrpc = pathlib.Path(mount[0]) / "kernel" / "sunrpc"
+if not sunrpc.is_dir():
+ print("ERROR: sysfs does not have sunrpc directory")
+ sys.exit(1)
+
+def read_addr_file(path):
+ try:
+ with open(path, 'r') as f:
+ return f.readline().strip()
+ except:
+ return "(enoent)"
+
+def write_addr_file(path, newaddr):
+ with open(path, 'w') as f:
+ f.write(newaddr)
+ return read_addr_file(path)
+
+def read_info_file(path):
+ res = collections.defaultdict(int)
+ try:
+ with open(path) as info:
+ lines = [ l.split("=", 1) for l in info if "=" in l ]
+ res.update({ key:int(val.strip()) for (key, val) in lines })
+ finally:
+ return res
+
+
+class Xprt:
+ def __init__(self, path):
+ self.path = path
+ self.name = path.stem.rsplit("-", 1)[0]
+ self.type = path.stem.split("-")[2]
+ self.info = read_info_file(path / "xprt_info")
+ self.dstaddr = read_addr_file(path / "dstaddr")
+ self.srcaddr = read_addr_file(path / "srcaddr")
+ self.read_state()
+
+ def __lt__(self, rhs):
+ return self.name < rhs.name
+
+ def _xprt(self):
+ main = ", main" if self.info.get("main_xprt") else ""
+ return f"{self.name}: {self.type}, {self.dstaddr}, " \
+ f"port {self.info['dst_port']}, state <{self.state}>{main}"
+
+ def _src_reqs(self):
+ return f" Source: {self.srcaddr}, port {self.info['src_port']}, " \
+ f"Requests: {self.info['num_reqs']}"
+
+ def _cong_slots(self):
+ return f" Congestion: cur {self.info['cur_cong']}, win {self.info['cong_win']}, " \
+ f"Slots: min {self.info['min_num_slots']}, max {self.info['max_num_slots']}"
+
+ def _queues(self):
+ return f" Queues: binding {self.info['binding_q_len']}, " \
+ f"sending {self.info['sending_q_len']}, pending {self.info['pending_q_len']}, " \
+ f"backlog {self.info['backlog_q_len']}, tasks {self.info['tasks_queuelen']}"
+
+ def __str__(self):
+ if not self.path.exists():
+ return f"{self.name}: has been removed"
+ return "\n".join([self._xprt(), self._src_reqs(),
+ self._cong_slots(), self._queues() ])
+
+ def read_state(self):
+ if self.path.exists():
+ with open(self.path / "xprt_state") as f:
+ self.state = ','.join(f.readline().split()[1:])
+
+ def small_str(self):
+ main = " [main]" if self.info.get("main_xprt") else ""
+ return f"{self.name}: {self.type}, {self.dstaddr}{main}"
+
+ def set_dstaddr(self, newaddr):
+ self.dstaddr = write_addr_file(self.path / "dstaddr", newaddr)
+
+ def set_state(self, state):
+ if self.info.get("main_xprt"):
+ raise Exception(f"Main xprts cannot be set {state}")
+ with open(self.path / "xprt_state", 'w') as f:
+ f.write(state)
+ self.read_state()
+
+ def remove(self):
+ if self.info.get("main_xprt"):
+ raise Exception("Main xprts cannot be removed")
+ self.set_state("offline")
+ self.set_state("remove")
+
+ def add_command(subparser):
+ parser = subparser.add_parser("xprt", help="Commands for individual xprts")
+ parser.set_defaults(func=Xprt.show, xprt=None)
+ subparser = parser.add_subparsers()
+
+ remove = subparser.add_parser("remove", help="Remove an xprt")
+ remove.add_argument("xprt", metavar="XPRT", nargs=1,
+ help="Name of the xprt to remove")
+ remove.set_defaults(func=Xprt.set_property, property="remove")
+
+ show = subparser.add_parser("show", help="Show xprts")
+ show.add_argument("xprt", metavar="XPRT", nargs='?',
+ help="Name of a specific xprt to show")
+ show.set_defaults(func=Xprt.show)
+
+ set = subparser.add_parser("set", help="Change an xprt property")
+ set.add_argument("xprt", metavar="XPRT", nargs=1,
+ help="Name of a specific xprt to modify")
+ subparser = set.add_subparsers(required=True)
+ online = subparser.add_parser("online", help="Set an xprt online")
+ online.set_defaults(func=Xprt.set_property, property="online")
+ offline = subparser.add_parser("offline", help="Set an xprt offline")
+ offline.set_defaults(func=Xprt.set_property, property="offline")
+ dstaddr = subparser.add_parser("dstaddr", help="Change an xprt's dstaddr")
+ dstaddr.add_argument("newaddr", metavar="NEWADDR", nargs=1,
+ help="The new address for the xprt")
+ dstaddr.set_defaults(func=Xprt.set_property, property="dstaddr")
+
+ def get_by_name(name):
+ glob = f"**/{name}-*" if name else "**/xprt-*"
+ res = [ Xprt(x) for x in (sunrpc / "xprt-switches").glob(glob) ]
+ if name and len(res) == 0:
+ raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT),
+ f"{sunrpc / 'xprt-switches' / glob}")
+ return sorted(res)
+
+ def show(args):
+ for xprt in Xprt.get_by_name(args.xprt):
+ print(xprt)
+
+ def set_property(args):
+ for xprt in Xprt.get_by_name(args.xprt[0]):
+ if args.property == "dstaddr":
+ xprt.set_dstaddr(socket.gethostbyname(args.newaddr[0]))
+ elif args.property == "remove":
+ xprt.remove()
+ else:
+ xprt.set_state(args.property)
+ print(xprt)
+
+
+class XprtSwitch:
+ def __init__(self, path, sep=":"):
+ self.path = path
+ self.name = path.stem
+ self.info = read_info_file(path / "xprt_switch_info")
+ self.xprts = sorted([ Xprt(p) for p in self.path.iterdir() if p.is_dir() ])
+ self.sep = sep
+
+ def __lt__(self, rhs):
+ return self.name < rhs.name
+
+ def __str__(self):
+ switch = f"{self.name}{self.sep} " \
+ f"xprts {self.info['num_xprts']}, " \
+ f"active {self.info['num_active']}, " \
+ f"queue {self.info['queue_len']}"
+ xprts = [ f" {x.small_str()}" for x in self.xprts ]
+ return "\n".join([ switch ] + xprts)
+
+ def add_command(subparser):
+ parser = subparser.add_parser("switch", help="Commands for xprt switches")
+ parser.set_defaults(func=XprtSwitch.show, switch=None)
+ subparser = parser.add_subparsers()
+
+ show = subparser.add_parser("show", help="Show xprt switches")
+ show.add_argument("switch", metavar="SWITCH", nargs='?',
+ help="Name of a specific switch to show")
+ show.set_defaults(func=XprtSwitch.show)
+
+ set = subparser.add_parser("set", help="Change an xprt switch property")
+ set.add_argument("switch", metavar="SWITCH", nargs=1,
+ help="Name of a specific xprt switch to modify")
+ subparser = set.add_subparsers(required=True)
+ dstaddr = subparser.add_parser("dstaddr", help="Change an xprt switch's dstaddr")
+ dstaddr.add_argument("newaddr", metavar="NEWADDR", nargs=1,
+ help="The new address for the xprt switch")
+ dstaddr.set_defaults(func=XprtSwitch.set_property, property="dstaddr")
+
+ def get_by_name(name):
+ xprt_switches = sunrpc / "xprt-switches"
+ if name:
+ return [ XprtSwitch(xprt_switches / name) ]
+ return [ XprtSwitch(f) for f in sorted(xprt_switches.iterdir()) ]
+
+ def show(args):
+ for switch in XprtSwitch.get_by_name(args.switch):
+ print(switch)
+
+ def set_property(args):
+ for switch in XprtSwitch.get_by_name(args.switch[0]):
+ resolved = socket.gethostbyname(args.newaddr[0])
+ for xprt in switch.xprts:
+ xprt.set_dstaddr(resolved)
+ print(switch)
+
+
+class RpcClient:
+ def __init__(self, path):
+ self.path = path
+ self.name = path.stem
+ self.switch = XprtSwitch(path / (path / "switch").readlink(), sep=",")
+
+ def __lt__(self, rhs):
+ return self.name < rhs.name
+
+ def __str__(self):
+ return f"{self.name}: {self.switch}"
+
+ def add_command(subparser):
+ parser = subparser.add_parser("client", help="Commands for rpc clients")
+ parser.set_defaults(func=RpcClient.show, client=None)
+ subparser = parser.add_subparsers()
+
+ show = subparser.add_parser("show", help="Show rpc clients")
+ show.add_argument("client", metavar="CLIENT", nargs='?',
+ help="Name of a specific rpc client to show")
+ parser.set_defaults(func=RpcClient.show)
+
+ def get_by_name(name):
+ rpc_clients = sunrpc / "rpc-clients"
+ if name:
+ return [ RpcClient(rpc_clients / name) ]
+ return [ RpcClient(f) for f in sorted(rpc_clients.iterdir()) ]
+
+ def show(args):
+ for client in RpcClient.get_by_name(args.client):
+ print(client)
+
+
+parser = argparse.ArgumentParser()
+
+def show_small_help(args):
+ parser.print_usage()
+ print("sunrpc dir:", sunrpc)
+parser.set_defaults(func=show_small_help)
+
+subparser = parser.add_subparsers(title="commands")
+RpcClient.add_command(subparser)
+XprtSwitch.add_command(subparser)
+Xprt.add_command(subparser)
+
+args = parser.parse_args()
+try:
+ args.func(args)
+except Exception as e:
+ print(str(e))
+ sys.exit(1)
diff --git a/utils/idmapd/idmapd.c b/utils/idmapd/idmapd.c
index e2c160e..e79c124 100644
--- a/utils/idmapd/idmapd.c
+++ b/utils/idmapd/idmapd.c
@@ -474,7 +474,7 @@ main(int argc, char **argv)
event_free(svrdirev);
event_base_free(evbase);
- return 1;
+ return 0;
}
static void
diff --git a/utils/idmapd/idmapd.man b/utils/idmapd/idmapd.man
index 5f34d2b..8215d25 100644
--- a/utils/idmapd/idmapd.man
+++ b/utils/idmapd/idmapd.man
@@ -24,13 +24,13 @@ the NFSv4 kernel client and server, to which it communicates via
upcalls, by translating user and group IDs to names, and vice versa.
.Pp
The system derives the
-.I user
+.Em user
part of the string by performing a password or group lookup.
The lookup mechanism is configured in
.Pa /etc/idmapd.conf
.Pp
By default, the
-.I domain
+.Em domain
part of the string is the system's DNS domain name.
It can also be specified in
.Pa /etc/idmapd.conf
diff --git a/utils/mount/nfsmount.conf.man b/utils/mount/nfsmount.conf.man
index 73c3e11..34879c8 100644
--- a/utils/mount/nfsmount.conf.man
+++ b/utils/mount/nfsmount.conf.man
@@ -1,4 +1,4 @@
-."@(#)nfsmount.conf.5"
+.\" @(#)nfsmount.conf.5"
.TH NFSMOUNT.CONF 5 "16 December 2020"
.SH NAME
nfsmount.conf - Configuration file for NFS mounts
diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c
index 3c4e218..dbdd11e 100644
--- a/utils/mount/stropts.c
+++ b/utils/mount/stropts.c
@@ -973,7 +973,9 @@ fall_back:
if ((result = nfs_try_mount_v3v2(mi, FALSE)))
return result;
- errno = olderrno;
+ if (errno != EBUSY && errno != EACCES)
+ errno = olderrno;
+
return result;
}
diff --git a/utils/mountd/mountd.man b/utils/mountd/mountd.man
index 77e6299..a206a3e 100644
--- a/utils/mountd/mountd.man
+++ b/utils/mountd/mountd.man
@@ -286,10 +286,9 @@ The values recognized in the
section include
.BR TCP ,
.BR UDP ,
-.BR vers2 ,
.BR vers3 ", and"
.B vers4
-which each have same same meaning as given by
+which each have the same meaning as given by
.BR rpc.nfsd (8).
.SH TCP_WRAPPERS SUPPORT
diff --git a/utils/nfsd/nfsd.man b/utils/nfsd/nfsd.man
index 716f538..634b8a6 100644
--- a/utils/nfsd/nfsd.man
+++ b/utils/nfsd/nfsd.man
@@ -156,8 +156,6 @@ Enable (with "on" or "yes" etc) or disable ("off", "no") UDP support.
.B TCP
Enable or disable TCP support.
.TP
-.B vers2
-.TP
.B vers3
.TP
.B vers4
diff --git a/utils/nfsidmap/nfsidmap.man b/utils/nfsidmap/nfsidmap.man
index 2af16f3..1911c41 100644
--- a/utils/nfsidmap/nfsidmap.man
+++ b/utils/nfsidmap/nfsidmap.man
@@ -2,7 +2,7 @@
.\"@(#)nfsidmap(8) - The NFS idmapper upcall program
.\"
.\" Copyright (C) 2010 Bryan Schumaker <bjschuma@netapp.com>
-.TH nfsidmap 5 "1 October 2010"
+.TH nfsidmap 8 "1 October 2010"
.SH NAME
nfsidmap \- The NFS idmapper upcall program
.SH SYNOPSIS

View File

@ -1,5 +1,5 @@
diff --git a/.gitignore b/.gitignore diff --git a/.gitignore b/.gitignore
index c89d1cd2..df791a83 100644 index c89d1cd..df791a8 100644
--- a/.gitignore --- a/.gitignore
+++ b/.gitignore +++ b/.gitignore
@@ -61,6 +61,8 @@ utils/statd/statd @@ -61,6 +61,8 @@ utils/statd/statd
@ -12,7 +12,7 @@ index c89d1cd2..df791a83 100644
support/export/mount_clnt.c support/export/mount_clnt.c
support/export/mount_xdr.c support/export/mount_xdr.c
diff --git a/aclocal/bsdsignals.m4 b/aclocal/bsdsignals.m4 diff --git a/aclocal/bsdsignals.m4 b/aclocal/bsdsignals.m4
index 24572aa7..362ddb5b 100644 index 24572aa..362ddb5 100644
--- a/aclocal/bsdsignals.m4 --- a/aclocal/bsdsignals.m4
+++ b/aclocal/bsdsignals.m4 +++ b/aclocal/bsdsignals.m4
@@ -2,13 +2,13 @@ dnl *********** BSD vs. POSIX signal handling ************** @@ -2,13 +2,13 @@ dnl *********** BSD vs. POSIX signal handling **************
@ -42,7 +42,7 @@ index 24572aa7..362ddb5b 100644
*linux*) knfsd_cv_bsd_signals=no;; *linux*) knfsd_cv_bsd_signals=no;;
*bsd*) knfsd_cv_bsd_signals=yes;; *bsd*) knfsd_cv_bsd_signals=yes;;
diff --git a/aclocal/kerberos5.m4 b/aclocal/kerberos5.m4 diff --git a/aclocal/kerberos5.m4 b/aclocal/kerberos5.m4
index bf0e88bc..f96f0fd4 100644 index bf0e88b..f96f0fd 100644
--- a/aclocal/kerberos5.m4 --- a/aclocal/kerberos5.m4
+++ b/aclocal/kerberos5.m4 +++ b/aclocal/kerberos5.m4
@@ -6,7 +6,7 @@ dnl The Kerberos gssapi library will be dynamically loaded? @@ -6,7 +6,7 @@ dnl The Kerberos gssapi library will be dynamically loaded?
@ -55,7 +55,7 @@ index bf0e88bc..f96f0fd4 100644
yes|no) yes|no)
krb5_with="" krb5_with=""
diff --git a/aclocal/libblkid.m4 b/aclocal/libblkid.m4 diff --git a/aclocal/libblkid.m4 b/aclocal/libblkid.m4
index 10824e9f..1b8884ce 100644 index 10824e9..1b8884c 100644
--- a/aclocal/libblkid.m4 --- a/aclocal/libblkid.m4
+++ b/aclocal/libblkid.m4 +++ b/aclocal/libblkid.m4
@@ -5,15 +5,14 @@ AC_DEFUN([AC_BLKID_VERS], [ @@ -5,15 +5,14 @@ AC_DEFUN([AC_BLKID_VERS], [
@ -77,7 +77,7 @@ index 10824e9f..1b8884ce 100644
AC_MSG_RESULT($libblkid_cv_is_recent) AC_MSG_RESULT($libblkid_cv_is_recent)
])dnl ])dnl
diff --git a/aclocal/libsqlite3.m4 b/aclocal/libsqlite3.m4 diff --git a/aclocal/libsqlite3.m4 b/aclocal/libsqlite3.m4
index 8c38993c..16b8c8a1 100644 index 8c38993..16b8c8a 100644
--- a/aclocal/libsqlite3.m4 --- a/aclocal/libsqlite3.m4
+++ b/aclocal/libsqlite3.m4 +++ b/aclocal/libsqlite3.m4
@@ -14,7 +14,7 @@ AC_DEFUN([AC_SQLITE3_VERS], [ @@ -14,7 +14,7 @@ AC_DEFUN([AC_SQLITE3_VERS], [
@ -100,7 +100,7 @@ index 8c38993c..16b8c8a1 100644
AC_MSG_RESULT($libsqlite3_cv_is_recent) AC_MSG_RESULT($libsqlite3_cv_is_recent)
diff --git a/aclocal/libtirpc.m4 b/aclocal/libtirpc.m4 diff --git a/aclocal/libtirpc.m4 b/aclocal/libtirpc.m4
index 27368ff2..bddae022 100644 index 27368ff..bddae02 100644
--- a/aclocal/libtirpc.m4 --- a/aclocal/libtirpc.m4
+++ b/aclocal/libtirpc.m4 +++ b/aclocal/libtirpc.m4
@@ -37,8 +37,7 @@ dnl @@ -37,8 +37,7 @@ dnl
@ -127,7 +127,7 @@ index 27368ff2..bddae022 100644
dnl Now set $LIBTIRPC accordingly dnl Now set $LIBTIRPC accordingly
AS_IF([test "$has_libtirpc" = "yes"], AS_IF([test "$has_libtirpc" = "yes"],
diff --git a/aclocal/nfs-utils.m4 b/aclocal/nfs-utils.m4 diff --git a/aclocal/nfs-utils.m4 b/aclocal/nfs-utils.m4
index fae8b95f..5f3ab0c2 100644 index fae8b95..5f3ab0c 100644
--- a/aclocal/nfs-utils.m4 --- a/aclocal/nfs-utils.m4
+++ b/aclocal/nfs-utils.m4 +++ b/aclocal/nfs-utils.m4
@@ -2,13 +2,12 @@ dnl *********** GNU libc 2 *************** @@ -2,13 +2,12 @@ dnl *********** GNU libc 2 ***************
@ -147,7 +147,7 @@ index fae8b95f..5f3ab0c2 100644
if test $knfsd_cv_glibc2 = yes; then if test $knfsd_cv_glibc2 = yes; then
CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE" CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
diff --git a/aclocal/rpcsec_vers.m4 b/aclocal/rpcsec_vers.m4 diff --git a/aclocal/rpcsec_vers.m4 b/aclocal/rpcsec_vers.m4
index 11d2f18c..43e5a966 100644 index 11d2f18..43e5a96 100644
--- a/aclocal/rpcsec_vers.m4 --- a/aclocal/rpcsec_vers.m4
+++ b/aclocal/rpcsec_vers.m4 +++ b/aclocal/rpcsec_vers.m4
@@ -2,7 +2,7 @@ dnl Checks librpcsec version @@ -2,7 +2,7 @@ dnl Checks librpcsec version
@ -160,7 +160,7 @@ index 11d2f18c..43e5a966 100644
PKG_CHECK_MODULES([GSSGLUE], [libgssglue >= 0.3]) PKG_CHECK_MODULES([GSSGLUE], [libgssglue >= 0.3])
AC_CHECK_LIB([gssglue], [gss_set_allowable_enctypes]) AC_CHECK_LIB([gssglue], [gss_set_allowable_enctypes])
diff --git a/configure.ac b/configure.ac diff --git a/configure.ac b/configure.ac
index 50e9b321..a13f3691 100644 index 50e9b32..a13f369 100644
--- a/configure.ac --- a/configure.ac
+++ b/configure.ac +++ b/configure.ac
@@ -14,33 +14,29 @@ dnl ************************************************************* @@ -14,33 +14,29 @@ dnl *************************************************************
@ -429,7 +429,7 @@ index 50e9b321..a13f3691 100644
tools/nfsconf/Makefile tools/nfsconf/Makefile
tools/nfsdclddb/Makefile tools/nfsdclddb/Makefile
diff --git a/nfs.conf b/nfs.conf diff --git a/nfs.conf b/nfs.conf
index 21d3e7b2..323f072b 100644 index 21d3e7b..323f072 100644
--- a/nfs.conf --- a/nfs.conf
+++ b/nfs.conf +++ b/nfs.conf
@@ -5,6 +5,10 @@ @@ -5,6 +5,10 @@
@ -444,7 +444,7 @@ index 21d3e7b2..323f072b 100644
# rootdir=/export # rootdir=/export
# #
diff --git a/support/export/v4clients.c b/support/export/v4clients.c diff --git a/support/export/v4clients.c b/support/export/v4clients.c
index 5e4f1058..5f15b614 100644 index 5e4f105..5f15b61 100644
--- a/support/export/v4clients.c --- a/support/export/v4clients.c
+++ b/support/export/v4clients.c +++ b/support/export/v4clients.c
@@ -8,9 +8,9 @@ @@ -8,9 +8,9 @@
@ -471,7 +471,7 @@ index 5e4f1058..5f15b614 100644
if (clients_fd >= 0) if (clients_fd >= 0)
return; return;
diff --git a/support/nfs/rpcdispatch.c b/support/nfs/rpcdispatch.c diff --git a/support/nfs/rpcdispatch.c b/support/nfs/rpcdispatch.c
index f7c27c98..7329f419 100644 index f7c27c9..7329f41 100644
--- a/support/nfs/rpcdispatch.c --- a/support/nfs/rpcdispatch.c
+++ b/support/nfs/rpcdispatch.c +++ b/support/nfs/rpcdispatch.c
@@ -26,12 +26,13 @@ rpc_dispatch(struct svc_req *rqstp, SVCXPRT *transp, @@ -26,12 +26,13 @@ rpc_dispatch(struct svc_req *rqstp, SVCXPRT *transp,
@ -491,7 +491,7 @@ index f7c27c98..7329f419 100644
svcerr_noproc(transp); svcerr_noproc(transp);
return; return;
diff --git a/support/nfsidmap/idmapd.conf.5 b/support/nfsidmap/idmapd.conf.5 diff --git a/support/nfsidmap/idmapd.conf.5 b/support/nfsidmap/idmapd.conf.5
index f5b18167..87e39bb4 100644 index f5b1816..87e39bb 100644
--- a/support/nfsidmap/idmapd.conf.5 --- a/support/nfsidmap/idmapd.conf.5
+++ b/support/nfsidmap/idmapd.conf.5 +++ b/support/nfsidmap/idmapd.conf.5
@@ -198,8 +198,8 @@ With this group names of a central directory can be shortened for an isolated or @@ -198,8 +198,8 @@ With this group names of a central directory can be shortened for an isolated or
@ -507,7 +507,7 @@ index f5b18167..87e39bb4 100644
.\" ------------------------------------------------------------------- .\" -------------------------------------------------------------------
diff --git a/systemd/50-nfs.conf b/systemd/50-nfs.conf diff --git a/systemd/50-nfs.conf b/systemd/50-nfs.conf
new file mode 100644 new file mode 100644
index 00000000..b56b2d76 index 0000000..b56b2d7
--- /dev/null --- /dev/null
+++ b/systemd/50-nfs.conf +++ b/systemd/50-nfs.conf
@@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
@ -528,7 +528,7 @@ index 00000000..b56b2d76
+# nfs module supports "fs.nfs.*" sysctls +# nfs module supports "fs.nfs.*" sysctls
+install nfs /sbin/modprobe --ignore-install nfs $CMDLINE_OPTS && /sbin/sysctl -q --pattern fs.nfs --system +install nfs /sbin/modprobe --ignore-install nfs $CMDLINE_OPTS && /sbin/sysctl -q --pattern fs.nfs --system
diff --git a/systemd/Makefile.am b/systemd/Makefile.am diff --git a/systemd/Makefile.am b/systemd/Makefile.am
index e7f5d818..63a50bf2 100644 index e7f5d81..63a50bf 100644
--- a/systemd/Makefile.am --- a/systemd/Makefile.am
+++ b/systemd/Makefile.am +++ b/systemd/Makefile.am
@@ -2,6 +2,8 @@ @@ -2,6 +2,8 @@
@ -564,7 +564,7 @@ index e7f5d818..63a50bf2 100644
+ mkdir -p $(DESTDIR)/usr/lib/modprobe.d + mkdir -p $(DESTDIR)/usr/lib/modprobe.d
+ cp $(modprobe_files) $(DESTDIR)/usr/lib/modprobe.d/ + cp $(modprobe_files) $(DESTDIR)/usr/lib/modprobe.d/
diff --git a/systemd/nfs.conf.man b/systemd/nfs.conf.man diff --git a/systemd/nfs.conf.man b/systemd/nfs.conf.man
index 4436a38a..e74083e9 100644 index 4436a38..e74083e 100644
--- a/systemd/nfs.conf.man --- a/systemd/nfs.conf.man
+++ b/systemd/nfs.conf.man +++ b/systemd/nfs.conf.man
@@ -171,7 +171,6 @@ Recognized values: @@ -171,7 +171,6 @@ Recognized values:
@ -594,7 +594,7 @@ index 4436a38a..e74083e9 100644
.TP 10n .TP 10n
.I /etc/nfs.conf .I /etc/nfs.conf
diff --git a/systemd/rpc-pipefs-generator.c b/systemd/rpc-pipefs-generator.c diff --git a/systemd/rpc-pipefs-generator.c b/systemd/rpc-pipefs-generator.c
index c24db567..7b2bb4f7 100644 index c24db56..7b2bb4f 100644
--- a/systemd/rpc-pipefs-generator.c --- a/systemd/rpc-pipefs-generator.c
+++ b/systemd/rpc-pipefs-generator.c +++ b/systemd/rpc-pipefs-generator.c
@@ -28,11 +28,12 @@ static int generate_mount_unit(const char *pipefs_path, const char *pipefs_unit, @@ -28,11 +28,12 @@ static int generate_mount_unit(const char *pipefs_path, const char *pipefs_unit,
@ -613,7 +613,7 @@ index c24db567..7b2bb4f7 100644
if (!f) if (!f)
{ {
diff --git a/tests/t0001-statd-basic-mon-unmon.sh b/tests/t0001-statd-basic-mon-unmon.sh diff --git a/tests/t0001-statd-basic-mon-unmon.sh b/tests/t0001-statd-basic-mon-unmon.sh
index 92517a14..e1065e76 100755 index 92517a1..e1065e7 100755
--- a/tests/t0001-statd-basic-mon-unmon.sh --- a/tests/t0001-statd-basic-mon-unmon.sh
+++ b/tests/t0001-statd-basic-mon-unmon.sh +++ b/tests/t0001-statd-basic-mon-unmon.sh
@@ -21,8 +21,9 @@ @@ -21,8 +21,9 @@
@ -628,7 +628,7 @@ index 92517a14..e1065e76 100755
start_statd start_statd
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
diff --git a/tests/test-lib.sh b/tests/test-lib.sh diff --git a/tests/test-lib.sh b/tests/test-lib.sh
index e47ad135..b62ac2a6 100644 index e47ad13..b62ac2a 100644
--- a/tests/test-lib.sh --- a/tests/test-lib.sh
+++ b/tests/test-lib.sh +++ b/tests/test-lib.sh
@@ -37,6 +37,15 @@ check_root() { @@ -37,6 +37,15 @@ check_root() {
@ -648,7 +648,7 @@ index e47ad135..b62ac2a6 100644
lockd_registered() { lockd_registered() {
rpcinfo -p | grep -q nlockmgr rpcinfo -p | grep -q nlockmgr
diff --git a/tools/Makefile.am b/tools/Makefile.am diff --git a/tools/Makefile.am b/tools/Makefile.am
index 9b4b0803..40c17c37 100644 index 9b4b080..40c17c3 100644
--- a/tools/Makefile.am --- a/tools/Makefile.am
+++ b/tools/Makefile.am +++ b/tools/Makefile.am
@@ -12,6 +12,6 @@ if CONFIG_NFSDCLD @@ -12,6 +12,6 @@ if CONFIG_NFSDCLD
@ -661,21 +661,21 @@ index 9b4b0803..40c17c37 100644
MAINTAINERCLEANFILES = Makefile.in MAINTAINERCLEANFILES = Makefile.in
diff --git a/tools/nfsrahead/99-nfs.rules b/tools/nfsrahead/99-nfs.rules diff --git a/tools/nfsrahead/99-nfs.rules b/tools/nfsrahead/99-nfs.rules
new file mode 100644 new file mode 100644
index 00000000..c74914b2 index 0000000..c74914b
--- /dev/null --- /dev/null
+++ b/tools/nfsrahead/99-nfs.rules +++ b/tools/nfsrahead/99-nfs.rules
@@ -0,0 +1 @@ @@ -0,0 +1 @@
+SUBSYSTEM=="bdi", ACTION=="add", PROGRAM="/usr/libexec/nfsrahead %k", ATTR{read_ahead_kb}="%c" +SUBSYSTEM=="bdi", ACTION=="add", PROGRAM="/usr/libexec/nfsrahead %k", ATTR{read_ahead_kb}="%c"
diff --git a/tools/nfsrahead/99-nfs.rules.in b/tools/nfsrahead/99-nfs.rules.in diff --git a/tools/nfsrahead/99-nfs.rules.in b/tools/nfsrahead/99-nfs.rules.in
new file mode 100644 new file mode 100644
index 00000000..648813c5 index 0000000..648813c
--- /dev/null --- /dev/null
+++ b/tools/nfsrahead/99-nfs.rules.in +++ b/tools/nfsrahead/99-nfs.rules.in
@@ -0,0 +1 @@ @@ -0,0 +1 @@
+SUBSYSTEM=="bdi", ACTION=="add", PROGRAM="_libexecdir_/nfsrahead %k", ATTR{read_ahead_kb}="%c" +SUBSYSTEM=="bdi", ACTION=="add", PROGRAM="_libexecdir_/nfsrahead %k", ATTR{read_ahead_kb}="%c"
diff --git a/tools/nfsrahead/Makefile.am b/tools/nfsrahead/Makefile.am diff --git a/tools/nfsrahead/Makefile.am b/tools/nfsrahead/Makefile.am
new file mode 100644 new file mode 100644
index 00000000..845ea0d5 index 0000000..845ea0d
--- /dev/null --- /dev/null
+++ b/tools/nfsrahead/Makefile.am +++ b/tools/nfsrahead/Makefile.am
@@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
@ -697,7 +697,7 @@ index 00000000..845ea0d5
+ $(RM) 99-nfs.rules + $(RM) 99-nfs.rules
diff --git a/tools/nfsrahead/main.c b/tools/nfsrahead/main.c diff --git a/tools/nfsrahead/main.c b/tools/nfsrahead/main.c
new file mode 100644 new file mode 100644
index 00000000..c83c6f71 index 0000000..c83c6f7
--- /dev/null --- /dev/null
+++ b/tools/nfsrahead/main.c +++ b/tools/nfsrahead/main.c
@@ -0,0 +1,192 @@ @@ -0,0 +1,192 @@
@ -895,7 +895,7 @@ index 00000000..c83c6f71
+} +}
diff --git a/tools/nfsrahead/nfsrahead.man b/tools/nfsrahead/nfsrahead.man diff --git a/tools/nfsrahead/nfsrahead.man b/tools/nfsrahead/nfsrahead.man
new file mode 100644 new file mode 100644
index 00000000..5488f633 index 0000000..5488f63
--- /dev/null --- /dev/null
+++ b/tools/nfsrahead/nfsrahead.man +++ b/tools/nfsrahead/nfsrahead.man
@@ -0,0 +1,72 @@ @@ -0,0 +1,72 @@
@ -973,7 +973,7 @@ index 00000000..5488f633
+Thiago Rafael Becker <trbecker@gmail.com> +Thiago Rafael Becker <trbecker@gmail.com>
diff --git a/tools/rpcctl/Makefile.am b/tools/rpcctl/Makefile.am diff --git a/tools/rpcctl/Makefile.am b/tools/rpcctl/Makefile.am
new file mode 100644 new file mode 100644
index 00000000..33fb431f index 0000000..33fb431
--- /dev/null --- /dev/null
+++ b/tools/rpcctl/Makefile.am +++ b/tools/rpcctl/Makefile.am
@@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
@ -992,7 +992,7 @@ index 00000000..33fb431f
+MAINTAINERCLEANFILES=Makefile.in +MAINTAINERCLEANFILES=Makefile.in
diff --git a/tools/rpcctl/rpcctl.man b/tools/rpcctl/rpcctl.man diff --git a/tools/rpcctl/rpcctl.man b/tools/rpcctl/rpcctl.man
new file mode 100644 new file mode 100644
index 00000000..b87ba0df index 0000000..b87ba0d
--- /dev/null --- /dev/null
+++ b/tools/rpcctl/rpcctl.man +++ b/tools/rpcctl/rpcctl.man
@@ -0,0 +1,67 @@ @@ -0,0 +1,67 @@
@ -1065,7 +1065,7 @@ index 00000000..b87ba0df
+Anna Schumaker <Anna.Schumaker@Netapp.com> +Anna Schumaker <Anna.Schumaker@Netapp.com>
diff --git a/tools/rpcctl/rpcctl.py b/tools/rpcctl/rpcctl.py diff --git a/tools/rpcctl/rpcctl.py b/tools/rpcctl/rpcctl.py
new file mode 100755 new file mode 100755
index 00000000..d2110ad6 index 0000000..d2110ad
--- /dev/null --- /dev/null
+++ b/tools/rpcctl/rpcctl.py +++ b/tools/rpcctl/rpcctl.py
@@ -0,0 +1,262 @@ @@ -0,0 +1,262 @@
@ -1331,8 +1331,69 @@ index 00000000..d2110ad6
+except Exception as e: +except Exception as e:
+ print(str(e)) + print(str(e))
+ sys.exit(1) + sys.exit(1)
diff --git a/utils/gssd/svcgssd.c b/utils/gssd/svcgssd.c
index 881207b..ce78d8f 100644
--- a/utils/gssd/svcgssd.c
+++ b/utils/gssd/svcgssd.c
@@ -211,9 +211,6 @@ main(int argc, char *argv[])
rpc_verbosity = conf_get_num("svcgssd", "RPC-Verbosity", rpc_verbosity);
idmap_verbosity = conf_get_num("svcgssd", "IDMAP-Verbosity", idmap_verbosity);
- /* We don't need the config anymore */
- conf_cleanup();
-
while ((opt = getopt(argc, argv, "fivrnp:")) != -1) {
switch (opt) {
case 'f':
@@ -298,9 +295,9 @@ main(int argc, char *argv[])
(const gss_OID)GSS_C_NT_HOSTBASED_SERVICE);
if (status == FALSE) {
printerr(0, "unable to obtain root (machine) credentials\n");
- printerr(0, "do you have a keytab entry for "
- "nfs/<your.host>@<YOUR.REALM> in "
- "/etc/krb5.keytab?\n");
+ printerr(0, "do you have a keytab entry for %s in"
+ "/etc/krb5.keytab?\n",
+ principal ? principal : "nfs/<your.host>@<YOUR.REALM>");
exit(1);
}
} else {
@@ -328,6 +325,9 @@ main(int argc, char *argv[])
daemon_ready();
+ /* We don't need the config anymore */
+ conf_cleanup();
+
nfs4_init_name_mapping(NULL); /* XXX: should only do this once */
rc = event_base_dispatch(evbase);
diff --git a/utils/gssd/svcgssd.man b/utils/gssd/svcgssd.man
index 15ef4c9..8771c03 100644
--- a/utils/gssd/svcgssd.man
+++ b/utils/gssd/svcgssd.man
@@ -61,6 +61,19 @@ this is equivalent to the
option. If set to any other value, that is used like the
.B -p
option.
+.TP
+.B verbosity
+Value which is equivalent to the number of
+.BR -v .
+.TP
+.B rpc-verbosity
+Value which is equivalent to the number of
+.BR -r .
+.TP
+.B idmap-verbosity
+Value which is equivalent to the number of
+.BR -i .
+
.SH SEE ALSO
.BR rpc.gssd(8),
diff --git a/utils/idmapd/idmapd.c b/utils/idmapd/idmapd.c diff --git a/utils/idmapd/idmapd.c b/utils/idmapd/idmapd.c
index e2c160e8..e79c124d 100644 index e2c160e..e79c124 100644
--- a/utils/idmapd/idmapd.c --- a/utils/idmapd/idmapd.c
+++ b/utils/idmapd/idmapd.c +++ b/utils/idmapd/idmapd.c
@@ -474,7 +474,7 @@ main(int argc, char **argv) @@ -474,7 +474,7 @@ main(int argc, char **argv)
@ -1345,7 +1406,7 @@ index e2c160e8..e79c124d 100644
static void static void
diff --git a/utils/idmapd/idmapd.man b/utils/idmapd/idmapd.man diff --git a/utils/idmapd/idmapd.man b/utils/idmapd/idmapd.man
index 5f34d2bf..8215d259 100644 index 5f34d2b..8215d25 100644
--- a/utils/idmapd/idmapd.man --- a/utils/idmapd/idmapd.man
+++ b/utils/idmapd/idmapd.man +++ b/utils/idmapd/idmapd.man
@@ -24,13 +24,13 @@ the NFSv4 kernel client and server, to which it communicates via @@ -24,13 +24,13 @@ the NFSv4 kernel client and server, to which it communicates via
@ -1365,7 +1426,7 @@ index 5f34d2bf..8215d259 100644
It can also be specified in It can also be specified in
.Pa /etc/idmapd.conf .Pa /etc/idmapd.conf
diff --git a/utils/mount/nfsmount.conf.man b/utils/mount/nfsmount.conf.man diff --git a/utils/mount/nfsmount.conf.man b/utils/mount/nfsmount.conf.man
index 73c3e118..34879c8d 100644 index 73c3e11..34879c8 100644
--- a/utils/mount/nfsmount.conf.man --- a/utils/mount/nfsmount.conf.man
+++ b/utils/mount/nfsmount.conf.man +++ b/utils/mount/nfsmount.conf.man
@@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
@ -1375,7 +1436,7 @@ index 73c3e118..34879c8d 100644
.SH NAME .SH NAME
nfsmount.conf - Configuration file for NFS mounts nfsmount.conf - Configuration file for NFS mounts
diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c
index 3c4e218a..dbdd11e7 100644 index 3c4e218..dbdd11e 100644
--- a/utils/mount/stropts.c --- a/utils/mount/stropts.c
+++ b/utils/mount/stropts.c +++ b/utils/mount/stropts.c
@@ -973,7 +973,9 @@ fall_back: @@ -973,7 +973,9 @@ fall_back:
@ -1390,7 +1451,7 @@ index 3c4e218a..dbdd11e7 100644
} }
diff --git a/utils/mountd/mountd.man b/utils/mountd/mountd.man diff --git a/utils/mountd/mountd.man b/utils/mountd/mountd.man
index 77e6299a..a206a3e2 100644 index 77e6299..a206a3e 100644
--- a/utils/mountd/mountd.man --- a/utils/mountd/mountd.man
+++ b/utils/mountd/mountd.man +++ b/utils/mountd/mountd.man
@@ -286,10 +286,9 @@ The values recognized in the @@ -286,10 +286,9 @@ The values recognized in the
@ -1406,7 +1467,7 @@ index 77e6299a..a206a3e2 100644
.SH TCP_WRAPPERS SUPPORT .SH TCP_WRAPPERS SUPPORT
diff --git a/utils/nfsd/nfsd.man b/utils/nfsd/nfsd.man diff --git a/utils/nfsd/nfsd.man b/utils/nfsd/nfsd.man
index 716f538b..634b8a63 100644 index 716f538..634b8a6 100644
--- a/utils/nfsd/nfsd.man --- a/utils/nfsd/nfsd.man
+++ b/utils/nfsd/nfsd.man +++ b/utils/nfsd/nfsd.man
@@ -156,8 +156,6 @@ Enable (with "on" or "yes" etc) or disable ("off", "no") UDP support. @@ -156,8 +156,6 @@ Enable (with "on" or "yes" etc) or disable ("off", "no") UDP support.
@ -1419,7 +1480,7 @@ index 716f538b..634b8a63 100644
.TP .TP
.B vers4 .B vers4
diff --git a/utils/nfsidmap/nfsidmap.man b/utils/nfsidmap/nfsidmap.man diff --git a/utils/nfsidmap/nfsidmap.man b/utils/nfsidmap/nfsidmap.man
index 2af16f31..1911c41b 100644 index 2af16f3..1911c41 100644
--- a/utils/nfsidmap/nfsidmap.man --- a/utils/nfsidmap/nfsidmap.man
+++ b/utils/nfsidmap/nfsidmap.man +++ b/utils/nfsidmap/nfsidmap.man
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@

View File

@ -2,7 +2,7 @@ Summary: NFS utilities and supporting clients and daemons for the kernel NFS ser
Name: nfs-utils Name: nfs-utils
URL: http://linux-nfs.org/ URL: http://linux-nfs.org/
Version: 2.6.1 Version: 2.6.1
Release: 2.rc6%{?dist} Release: 2.rc7%{?dist}
Epoch: 1 Epoch: 1
# group all 32bit related archs # group all 32bit related archs
@ -17,7 +17,7 @@ Source5: nfsconvert.sh
Source6: nfs-convert.service Source6: nfs-convert.service
Source7: 10-nfsv4.conf Source7: 10-nfsv4.conf
Patch001: nfs-utils-2.6.2-rc6.patch Patch001: nfs-utils-2.6.2-rc7.patch
Patch100: nfs-utils-1.2.1-statdpath-man.patch Patch100: nfs-utils-1.2.1-statdpath-man.patch
Patch101: nfs-utils-1.2.1-exp-subtree-warn-off.patch Patch101: nfs-utils-1.2.1-exp-subtree-warn-off.patch
@ -465,6 +465,9 @@ fi
%{_mandir}/*/nfsiostat.8.gz %{_mandir}/*/nfsiostat.8.gz
%changelog %changelog
* Thu Jun 23 2022 Steve Dickson <steved@redhat.com> 2.6.1-2.rc7
- Updated to the latest RC release: nfs-utils-2-6-2-rc6 (bz 2099697)
* Tue Jun 7 2022 Steve Dickson <steved@redhat.com> 2.6.1-2.rc6 * Tue Jun 7 2022 Steve Dickson <steved@redhat.com> 2.6.1-2.rc6
- Updated to the latest RC release: nfs-utils-2-6-2-rc6 (bz 2094561) - Updated to the latest RC release: nfs-utils-2-6-2-rc6 (bz 2094561)