Re: Question ref Running NFS at V4 Only

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux