On 09/15/2010 04:09 PM, Steve Dickson wrote: > On 09/14/2010 09:23 AM, Jeff Layton wrote: >> On Tue, 31 Aug 2010 15:32:40 -0400 >> Jeff Layton <jlayton@xxxxxxxxxx> wrote: >> >> Hi Steve, >> >> It's been a couple of weeks and this latest patch hasn't been committed... >> >> IIRC, you wanted changes to the xlog messages and were going to send an >> alternate patch. I'd like to see this in the next release of nfs-utils. >> What do we need to do to move this to resolution? > Sorry for taking so long to get to this.. > > What I was thinking is to simply make the error messages more definitive > as to what the problem is and how to fix it.. Logging that we are > falling back to the legacy probably would not mean much to mere > mortals... IMHO... > > I still think at some point nfsd should fail to start up, but logging > an error message at this point is fine.. > > Comments? > > steved. > > commit 8a78cb2e651d55fc1aaacf1e4ca9c009d1cf9113 > Author: Jeff Layton <jlayton@xxxxxxxxxx> > Date: Wed Sep 15 15:54:36 2010 -0400 > > rpc.nfsd: mount up nfsdfs is it doesn't appear to be mounted yet (try #3) > > There's a bit of a chicken and egg problem when nfsd is run the first > time. On Fedora/RHEL at least, /proc/fs/nfsd is mounted up whenever nfsd > is plugged in via a modprobe.conf "install" directive. > > If someone runs rpc.nfsd without plugging in nfsd.ko first, > /proc/fs/nfsd won't be mounted and rpc.nfsd will end up using the legacy > nfsctl interface. After that, nfsd will be plugged in and subsequent > rpc.nfsd invocations will use that instead. > > This is a problem as some nfsd command-line options are ignored when the > legacy interface is used. It'll also be a problem for people who want > IPv6 enabled servers. The upshot is that we really don't want to use the > legacy interface unless there is no other option. > > To avoid this situation, have rpc.nfsd check to see if the "threads" > file is already present. If it's not, then make an attempt to mount > /proc/fs/nfsd. This is a "best-effort" sort of thing, however so we > just ignore the return code from the mount attempt and fall back to > using nfsctl() if it fails. > > Signed-off-by: Steve Dickson <steved@xxxxxxxxxx> > > diff --git a/utils/nfsd/nfsd.c b/utils/nfsd/nfsd.c > index 1cda1e5..658b8fa 100644 > --- a/utils/nfsd/nfsd.c > +++ b/utils/nfsd/nfsd.c > @@ -246,6 +246,9 @@ main(int argc, char **argv) > exit(1); > } > > + /* make sure nfsdfs is mounted if it's available */ > + nfssvc_mount_nfsdfs(progname); > + > /* can only change number of threads if nfsd is already up */ > if (nfssvc_inuse()) { > socket_up = 1; > diff --git a/utils/nfsd/nfssvc.c b/utils/nfsd/nfssvc.c > index 34c67ca..f7edcba 100644 > --- a/utils/nfsd/nfssvc.c > +++ b/utils/nfsd/nfssvc.c > @@ -15,9 +15,11 @@ > #include <netdb.h> > #include <netinet/in.h> > #include <arpa/inet.h> > +#include <sys/stat.h> > #include <unistd.h> > #include <fcntl.h> > #include <errno.h> > +#include <stdlib.h> > > #include "nfslib.h" > #include "xlog.h" > @@ -31,9 +33,13 @@ > */ > #undef IPV6_SUPPORTED > > -#define NFSD_PORTS_FILE "/proc/fs/nfsd/portlist" > -#define NFSD_VERS_FILE "/proc/fs/nfsd/versions" > -#define NFSD_THREAD_FILE "/proc/fs/nfsd/threads" > +#ifndef NFSD_FS_DIR > +#define NFSD_FS_DIR "/proc/fs/nfsd" > +#endif > + > +#define NFSD_PORTS_FILE NFSD_FS_DIR "/portlist" > +#define NFSD_VERS_FILE NFSD_FS_DIR "/versions" > +#define NFSD_THREAD_FILE NFSD_FS_DIR "/threads" > > /* > * declaring a common static scratch buffer here keeps us from having to > @@ -44,6 +50,45 @@ > char buf[128]; > > /* > + * Using the "new" interfaces for nfsd requires that /proc/fs/nfsd is > + * actually mounted. Make an attempt to mount it here if it doesn't appear > + * to be. If the mount attempt fails, no big deal -- fall back to using nfsctl > + * instead. > + */ > +void > +nfssvc_mount_nfsdfs(char *progname) > +{ > + int err; > + struct stat statbuf; > + > + err = stat(NFSD_THREAD_FILE, &statbuf); > + if (err == 0) > + return; > + else if (errno != ENOENT) { > + xlog(L_ERROR, "Unable to stat %s: errno %d (%m)", > + NFSD_THREAD_FILE, errno); > + return; > + } One minor nit I just noticed... we really don't need that else if clause... it can be just an if clause... unless I'm missing something... steved. -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html