On Dec 27, 2013, at 1:43 PM, J.;Bruce Fields <bfields@xxxxxxxxxxxx> wrote: > On Fri, Dec 27, 2013 at 11:05:05AM -0500, Chuck Lever wrote: >> Hi- >> >> On Dec 27, 2013, at 5:17 AM, Kinglong Mee <kinglongmee@xxxxxxxxx> wrote: >> >>> On 12/24/2013 01:39 AM, J. Bruce Fields wrote: >>>> On Fri, Dec 20, 2013 at 05:10:42PM +0000, Gareth Williams wrote: >>>>> Hi, >>>>> >>>>> I'm trying to run NFS with protocol version 4 only (that is, with v2 >>>>> & v3 disabled) on a CentOS 6.5 install running as a KVM guest. >>>>> >>>>> The RedHat documentation (amongst others) states that rpcbind isn't >>>>> needed with v4, but if I start nfs without rpcbind I get errors. >>>> >>>> I suspect the kernel code needs to be fixed to not attempt to register >>>> with rpcbind n the v4-only case. (Or to attempt to register but ignore >>>> any error, I'm not sure which is best.) >>>> >>>> And this may not be the only issue in the v4-only case. This isn't >>>> really a priority for me right now, but I'd happily look at patches. >>> >>> Hi all, >>> >>> I make a patch for this problem, please have a check, thanks. >>> >>> From 64c1f96348213f39b9411ab25699a292edbef4ef Mon Sep 17 00:00:00 2001 >>> From: Kinglong Mee <kinglongmee@xxxxxxxxx> >>> Date: Fri, 27 Dec 2013 18:06:25 +0800 >>> Subject: [PATCH] NFSD: supports nfsv4 service without rpcbind >>> >>> 1. set vs_hidden in nfsd_version4 to avoid register nfsv4 to rpcbind >> >> IMO we do want the NFS port registered if rpcbind is running. NFSv4 is not a hidden service, like the client's callback server which can only be discovered by a forward advertisement (SETCLIENTID). >> >> I think I prefer ignoring the rpcb_set error for NFSv4. > > Agreed. My only concern would be that there be no unnecessary delays or > errors logged in the v4-only case if rpcbind isn't running. I believe the rpcb_set upcall now uses the AF_LOCAL transport, which should be able to detect immediately that rpcbind is not listening. The OP did not report a delay or hang, thankfully. > > --b. > >> >> >>> 2. don't start lockd when only supports nfsv4. >>> >>> Reported-by: Gareth Williams <gareth@xxxxxxxxxxxxxxxxxxxx> >>> Signed-off-by: Kinglong Mee <kinglongmee@xxxxxxxxx> >>> --- >>> fs/nfsd/netns.h | 3 +++ >>> fs/nfsd/nfs4proc.c | 1 + >>> fs/nfsd/nfsctl.c | 3 +++ >>> fs/nfsd/nfssvc.c | 21 ++++++++++++++++----- >>> 4 files changed, 23 insertions(+), 5 deletions(-) >>> >>> diff --git a/fs/nfsd/netns.h b/fs/nfsd/netns.h >>> index 849a7c3..ae2c179 100644 >>> --- a/fs/nfsd/netns.h >>> +++ b/fs/nfsd/netns.h >>> @@ -96,6 +96,9 @@ struct nfsd_net { >>> >>> bool nfsd_net_up; >>> >>> + bool lockd_up; >>> + u32 nfsd_needs_lockd; >>> + >>> /* >>> * Time of server startup >>> */ >>> diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c >>> index 419572f..1496376 100644 >>> --- a/fs/nfsd/nfs4proc.c >>> +++ b/fs/nfsd/nfs4proc.c >>> @@ -1881,6 +1881,7 @@ struct svc_version nfsd_version4 = { >>> .vs_proc = nfsd_procedures4, >>> .vs_dispatch = nfsd_dispatch, >>> .vs_xdrsize = NFS4_SVC_XDRSIZE, >>> + .vs_hidden = 1, >>> }; >>> >>> /* >>> diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c >>> index 7f55517..8c7b0f0 100644 >>> --- a/fs/nfsd/nfsctl.c >>> +++ b/fs/nfsd/nfsctl.c >>> @@ -575,6 +575,9 @@ static ssize_t __write_versions(struct file *file, char *buf, size_t size) >>> switch(num) { >>> case 2: >>> case 3: >>> + nfsd_vers(num, sign == '-' ? NFSD_CLEAR : NFSD_SET); >>> + nn->nfsd_needs_lockd = nfsd_vers(num, NFSD_TEST); >>> + break; >>> case 4: >>> nfsd_vers(num, sign == '-' ? NFSD_CLEAR : NFSD_SET); >>> break; >>> diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c >>> index 760c85a..2b841d8 100644 >>> --- a/fs/nfsd/nfssvc.c >>> +++ b/fs/nfsd/nfssvc.c >>> @@ -255,9 +255,14 @@ static int nfsd_startup_net(int nrservs, struct net *net) >>> ret = nfsd_init_socks(net); >>> if (ret) >>> goto out_socks; >>> - ret = lockd_up(net); >>> - if (ret) >>> - goto out_socks; >>> + >>> + if (nn->nfsd_needs_lockd && !nn->lockd_up) { >>> + ret = lockd_up(net); >>> + if (ret) >>> + goto out_socks; >>> + nn->lockd_up = 1; >>> + } >>> + >>> ret = nfs4_state_start_net(net); >>> if (ret) >>> goto out_lockd; >>> @@ -266,7 +271,10 @@ static int nfsd_startup_net(int nrservs, struct net *net) >>> return 0; >>> >>> out_lockd: >>> - lockd_down(net); >>> + if (nn->lockd_up) { >>> + lockd_down(net); >>> + nn->lockd_up = 0; >>> + } >>> out_socks: >>> nfsd_shutdown_generic(); >>> return ret; >>> @@ -277,7 +285,10 @@ static void nfsd_shutdown_net(struct net *net) >>> struct nfsd_net *nn = net_generic(net, nfsd_net_id); >>> >>> nfs4_state_shutdown_net(net); >>> - lockd_down(net); >>> + if (nn->lockd_up) { >>> + lockd_down(net); >>> + nn->lockd_up = 0; >>> + } >>> nn->nfsd_net_up = false; >>> nfsd_shutdown_generic(); >>> } >>> -- >>> 1.8.4.2 >>> >>> >>> -- >>> 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 >> >> -- >> Chuck Lever >> chuck[dot]lever[at]oracle[dot]com >> >> >> >> > -- > 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 -- Chuck Lever chuck[dot]lever[at]oracle[dot]com -- 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