Commit 09673fc0 authored by Rick Macklem's avatar Rick Macklem
Browse files

mountd(8): generate a syslog message when the "V4:" line is missing

Daniel reported that NFSv4 mounts were not working despite having
set "nfsv4_server_enable=YES" in /etc/rc.conf.  Mountd was logging a
message that there was no /etc/exports file.
He noted that creating a /etc/exports file with a "V4:" line in it
was needed make NFSv4 mounts work.
At least one "V4:" line in one of the exports(5) file(s) is needed to
make NFSv4 mounts work. This patch fixes mountd.c so that it logs a
message indicting that there is no "V4:" line in any exports(5)
file when NFSv4 mounts are enabled.
To avoid this message being generated erroneously, /etc/rc.d/mountd
is updated to make sure vfs.nfsd.server_max_nfsvers is properly set
before mountd(8) is started.

Reported by:	debdrup
PR:	253901
MFC after:	2 weeks
parent 075e4807
...@@ -34,6 +34,9 @@ mountd_precmd() ...@@ -34,6 +34,9 @@ mountd_precmd()
rc_flags="${rc_flags} -R" rc_flags="${rc_flags} -R"
else else
force_depend rpcbind || return 1 force_depend rpcbind || return 1
if ! checkyesno nfsv4_server_enable; then
sysctl vfs.nfsd.server_max_nfsvers=3 > /dev/null
fi fi
# mountd flags will differ depending on rc.conf settings # mountd flags will differ depending on rc.conf settings
...@@ -1888,10 +1888,11 @@ get_exportlist(int passno) ...@@ -1888,10 +1888,11 @@ get_exportlist(int passno)
struct iovec *iov; struct iovec *iov;
struct statfs *mntbufp; struct statfs *mntbufp;
char errmsg[255]; char errmsg[255];
int num, i; int error, i, nfs_maxvers, num;
int iovlen; int iovlen;
struct nfsex_args eargs; struct nfsex_args eargs;
FILE *debug_file; FILE *debug_file;
size_t nfs_maxvers_size;
if ((debug_file = fopen(_PATH_MOUNTDDEBUG, "r")) != NULL) { if ((debug_file = fopen(_PATH_MOUNTDDEBUG, "r")) != NULL) {
fclose(debug_file); fclose(debug_file);
...@@ -2015,6 +2016,21 @@ get_exportlist(int passno) ...@@ -2015,6 +2016,21 @@ get_exportlist(int passno)
read_exportfile(0); read_exportfile(0);
} }
if (strlen(v4root_dirpath) == 0) {
/* Check to see if a V4: line is needed. */
nfs_maxvers_size = sizeof(nfs_maxvers);
error = sysctlbyname("vfs.nfsd.server_max_nfsvers",
&nfs_maxvers, &nfs_maxvers_size, NULL, 0);
if (error != 0 || nfs_maxvers < NFS_VER2 || nfs_maxvers >
syslog(LOG_ERR, "sysctlbyname(vfs.nfsd."
"server_max_nfsvers) failed, defaulting to NFSv3");
nfs_maxvers = NFS_VER3;
if (nfs_maxvers == NFS_VER4)
syslog(LOG_ERR, "NFSv4 requires at least one V4: line");
if (iov != NULL) { if (iov != NULL) {
/* Free strings allocated by strdup() in getmntopts.c */ /* Free strings allocated by strdup() in getmntopts.c */
free(iov[0].iov_base); /* fstype */ free(iov[0].iov_base); /* fstype */
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment