Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 24 Apr 2011 08:47:46 -0400 (EDT)
From:      Rick Macklem <rmacklem@uoguelph.ca>
To:        Doug Barton <dougb@FreeBSD.org>
Cc:        rc@freebsd.org
Subject:   Re: rc scripts change for review
Message-ID:  <532445037.487687.1303649266310.JavaMail.root@erie.cs.uoguelph.ca>
In-Reply-To: <4DB3AA8C.7090003@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]


----- Original Message -----
> On 04/23/2011 15:40, Rick Macklem wrote:
> >>
> >>> One thing I am not sure about is the REQUIRE: list in mountd.
> >>> nfsserver and nfssrv essentially load the respective module. They
> >>> are only
> >>> used if sysctl variables need to be set and that's actually done
> >>> by
> >>> nfsd.
> >>> (Should they be listed in mountd or nfsd or ???)
> >>
> >> It's not a good idea to add single scripts that only have a tiny
> >> function, especially if they are only called conditionally (I.e.,
> >> they
> >> contain KEYWORD: nostart). It's preferred to handle these things
> >> things
> >> in the script that needs them, or if it's necessary in more than
> >> one
> >> script to add a function to the appropriate .subr (rc, or network).
> >>
> >> So can you say a little more about what you're trying to
> >> accomplish?
> >> It's not clear to me why instead of doing this:
> >>
> >> + if ! sysctl vfs.newnfs>/dev/null 2>&1; then
> >> + force_depend nfssrv || return 1
> >> + fi
> >>
> >> you would not just do this:
> >>
> >> + if ! sysctl vfs.newnfs>/dev/null 2>&1; then
> >> + load_kld nfsd
> >> + fi
> >>
> > Well, the intent of the above was to get the module loaded so that
> > sysctl could manipulate its sysctl variables. I played with it a bit
> > and it turns out that neither of the above code snippets work in the
> > sense that they don't affect the outcome.
> >
> > What is needed to make the sysctls work is "nfssrv" has to be in the
> > REQUIRED: list for either mountd or nfsd. Without it, the sysctls
> > fail
> > with unknown oid. (I'm guessing there is some delay between the
> > load_kld
> > and when the module gets its sysctl variables registered?)
> >
> > Now, I'm not sure whether there is any advantage to specifying
> > "nfssrv"
> > in nfsd or mountd, although both seem to work when I test them.
> > "nfsserver"
> > is in mountd, so unless you guys have a better suggestion, that's
> > where
> > I'll leave it.
> 
> From what you're describing the reason it works by using the nfsserver
> and nfssrv scripts is simply an accident of timing. That's not a good
> thing no matter how you look at it. :) I understand your dilemma in
> that the nfsserver "solution" was pre-existing, so you were just
> following the example you had. However I have this odd idea that we
> ought to fix broken code, not perpetuate it. Even if I weren't
> interested in this for pedantic value, the fact that it's only working
> now as an accident of timing is a good reason to fix it.
> 
> The load_kld module is safe to run unconditionally (it will simply
> return if the module is loaded). So what you could do (for both cases)
> is something like this:
> 
> load_kld nfsd
> while ! sysctl vfs.newnfs >/dev/null 2>&1; do
> sleep .5
> done
> 
> If that works, I think we should add that feature to load_kld itself.

I've updated the scripts at
  http://people.freebsd.org/~rmacklem/rc.conf
and attached them, so you might not need to go there.

Could you please take another look at them. This time nfsd uses the
two load_klds and I tried to use "err", but I'm not sure if I checked
for nfsuserd failing correctly.

Thanks for your help, rick

[-- Attachment #2 --]
--- nfsd.orig	2011-04-20 18:49:08.000000000 -0400
+++ nfsd	2011-04-24 07:33:08.000000000 -0400
@@ -19,19 +19,8 @@ sig_stop="USR1"
 
 nfsd_precmd()
 {
-	if checkyesno nfsv4_server_enable; then
-		# If nfsv4_server_enable is yes, force use
-		# of the experimental server
-		#
-		rc_flags="-e ${nfs_server_flags}"
-
-		if ! checkyesno nfsuserd_enable  && \
-		    ! /etc/rc.d/nfsuserd forcestatus 1>/dev/null 2>&1
-		then
-			force_depend nfsuserd || return 1
-		fi
-	else
-		rc_flags="${nfs_server_flags}"
+	if checkyesno oldnfs_server_enable; then
+		rc_flags="-o ${nfs_server_flags}"
 
 		if ! sysctl vfs.nfsrv >/dev/null 2>&1; then
 			force_depend nfsserver || return 1
@@ -41,6 +30,31 @@ nfsd_precmd()
 			echo 'NFS on reserved port only=YES'
 			sysctl vfs.nfsrv.nfs_privport=1 > /dev/null
 		fi
+	else
+		rc_flags="${nfs_server_flags}"
+
+		# Load the modules now, so that the vfs.newnfs sysctl
+		# oids are available.
+		load_kld nfscommon
+		load_kld nfsd
+
+		if checkyesno nfs_reserved_port_only; then
+			echo 'NFS on reserved port only=YES'
+			sysctl vfs.newnfs.nfs_privport=1 > /dev/null
+		fi
+
+		if checkyesno nfsv4_server_enable; then
+			if ! checkyesno nfsuserd_enable  && \
+			    ! /etc/rc.d/nfsuserd forcestatus 1>/dev/null 2>&1
+			then
+				if ! force_depend nfsuserd; then
+					err 1 "Cannot run nfsuserd"
+				fi
+			fi
+		else
+			echo 'NFSv4 is disabled'
+			sysctl vfs.newnfs.server_max_nfsvers=3 > /dev/null
+		fi
 	fi
 
 	if ! checkyesno rpcbind_enable  && \

[-- Attachment #3 --]
--- mountd.orig	2011-04-20 18:49:02.000000000 -0400
+++ mountd	2011-04-24 07:33:15.000000000 -0400
@@ -37,11 +37,10 @@ mountd_precmd()
 		fi
 	fi
 
-	# If nfsv4_server_enable is yes, force use of the experimental
-	# server
+	# If oldnfs_server_enable is yes, force use of the old NFS server
 	#
-	if checkyesno nfsv4_server_enable; then
-		rc_flags="-e ${rc_flags}"
+	if checkyesno oldnfs_server_enable; then
+		rc_flags="-o ${rc_flags}"
 	fi
 
 	if checkyesno zfs_enable; then

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?532445037.487687.1303649266310.JavaMail.root>