linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH 3/3] pnfs_submit: enforce requested DS only pNFS role
  2010-10-07 19:37   ` [PATCH 3/3] pnfs_submit: enforce requested DS only pNFS role andros
@ 2010-10-07 17:06     ` Benny Halevy
  2010-10-07 18:08       ` Benny Halevy
  2010-10-07 18:10       ` Fred Isaman
  0 siblings, 2 replies; 13+ messages in thread
From: Benny Halevy @ 2010-10-07 17:06 UTC (permalink / raw)
  To: andros; +Cc: linux-nfs

On 2010-10-07 15:37, andros@netapp.com wrote:
> From: Andy Adamson <andros@netapp.com>
> 
> Signed-off-by: Andy Adamson <andros@netapp.com>
> ---
>  fs/nfs/nfs4filelayoutdev.c |    5 -----
>  fs/nfs/nfs4state.c         |    5 +++++
>  2 files changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c
> index e0edf93..1f0ab62 100644
> --- a/fs/nfs/nfs4filelayoutdev.c
> +++ b/fs/nfs/nfs4filelayoutdev.c
> @@ -183,11 +183,6 @@ nfs4_pnfs_ds_create(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds)
>  		goto out_put;
>  	}
>  	/*
> -	 * Mask the (possibly) returned EXCHGID4_FLAG_USE_PNFS_MDS pNFS role
> -	 * The is_ds_only_session depends on this.
> -	 */
> -	clp->cl_exchange_flags &= ~EXCHGID4_FLAG_USE_PNFS_MDS;
> -	/*
>  	 * Set DS lease equal to the MDS lease, renewal is scheduled in
>  	 * create_session
>  	 */
> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
> index 91584ad..e2fc175 100644
> --- a/fs/nfs/nfs4state.c
> +++ b/fs/nfs/nfs4state.c
> @@ -188,6 +188,7 @@ static int nfs4_begin_drain_session(struct nfs_client *clp)
>  int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
>  {
>  	int status;
> +	u32 req_exchange_flags = clp->cl_exchange_flags;
>  
>  	nfs4_begin_drain_session(clp);
>  	status = nfs4_proc_exchange_id(clp, cred);
> @@ -196,6 +197,10 @@ int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
>  	status = nfs4_proc_create_session(clp);
>  	if (status != 0)
>  		goto out;
> +	if (is_ds_only_session(req_exchange_flags))
> +		/* Mask the (possibly) returned MDS and non-pNFS roles */

This comment does not really add anything substantial that the code doesn't tell you :)

> +		clp->cl_exchange_flags &=
> +		     ~(EXCHGID4_FLAG_USE_PNFS_MDS | EXCHGID4_FLAG_USE_NON_PNFS);

I'm not why you want to mask out EXCHGID4_FLAG_USE_NON_PNFS.
If the server is not a DS why not just return an error?

Benny

>  	nfs41_setup_state_renewal(clp);
>  	nfs_mark_client_ready(clp, NFS_CS_READY);
>  out:

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] pnfs_submit: enforce requested DS only pNFS role
  2010-10-07 17:06     ` Benny Halevy
@ 2010-10-07 18:08       ` Benny Halevy
  2010-10-07 18:41         ` Benny Halevy
  2010-10-07 18:10       ` Fred Isaman
  1 sibling, 1 reply; 13+ messages in thread
From: Benny Halevy @ 2010-10-07 18:08 UTC (permalink / raw)
  To: andros; +Cc: linux-nfs

On 2010-10-07 13:06, Benny Halevy wrote:
> On 2010-10-07 15:37, andros@netapp.com wrote:
>> From: Andy Adamson <andros@netapp.com>
>>
>> Signed-off-by: Andy Adamson <andros@netapp.com>
>> ---
>>  fs/nfs/nfs4filelayoutdev.c |    5 -----
>>  fs/nfs/nfs4state.c         |    5 +++++
>>  2 files changed, 5 insertions(+), 5 deletions(-)
>>
>> diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c
>> index e0edf93..1f0ab62 100644
>> --- a/fs/nfs/nfs4filelayoutdev.c
>> +++ b/fs/nfs/nfs4filelayoutdev.c
>> @@ -183,11 +183,6 @@ nfs4_pnfs_ds_create(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds)
>>  		goto out_put;
>>  	}
>>  	/*
>> -	 * Mask the (possibly) returned EXCHGID4_FLAG_USE_PNFS_MDS pNFS role
>> -	 * The is_ds_only_session depends on this.
>> -	 */
>> -	clp->cl_exchange_flags &= ~EXCHGID4_FLAG_USE_PNFS_MDS;
>> -	/*
>>  	 * Set DS lease equal to the MDS lease, renewal is scheduled in
>>  	 * create_session
>>  	 */
>> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
>> index 91584ad..e2fc175 100644
>> --- a/fs/nfs/nfs4state.c
>> +++ b/fs/nfs/nfs4state.c
>> @@ -188,6 +188,7 @@ static int nfs4_begin_drain_session(struct nfs_client *clp)
>>  int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
>>  {
>>  	int status;
>> +	u32 req_exchange_flags = clp->cl_exchange_flags;
>>  
>>  	nfs4_begin_drain_session(clp);
>>  	status = nfs4_proc_exchange_id(clp, cred);
>> @@ -196,6 +197,10 @@ int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
>>  	status = nfs4_proc_create_session(clp);
>>  	if (status != 0)
>>  		goto out;
>> +	if (is_ds_only_session(req_exchange_flags))
>> +		/* Mask the (possibly) returned MDS and non-pNFS roles */
> 
> This comment does not really add anything substantial that the code doesn't tell you :)
> 
>> +		clp->cl_exchange_flags &=
>> +		     ~(EXCHGID4_FLAG_USE_PNFS_MDS | EXCHGID4_FLAG_USE_NON_PNFS);
> 
> I'm not why you want to mask out EXCHGID4_FLAG_USE_NON_PNFS.
> If the server is not a DS why not just return an error?

So Andy convinced me and the spec. says that USE_PNFS_DS | USE_NON_PNFS
is a valid response.
However, if USE_PNFS_DS is unset in the response in this case
we need not create the client and better return an error.
I'll send a patch that does that.

Benny

> 
> Benny
> 
>>  	nfs41_setup_state_renewal(clp);
>>  	nfs_mark_client_ready(clp, NFS_CS_READY);
>>  out:
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] pnfs_submit: enforce requested DS only pNFS role
  2010-10-07 17:06     ` Benny Halevy
  2010-10-07 18:08       ` Benny Halevy
@ 2010-10-07 18:10       ` Fred Isaman
  2010-10-07 18:12         ` Fred Isaman
  1 sibling, 1 reply; 13+ messages in thread
From: Fred Isaman @ 2010-10-07 18:10 UTC (permalink / raw)
  To: Benny Halevy; +Cc: andros, linux-nfs

On Thu, Oct 7, 2010 at 1:06 PM, Benny Halevy <bhalevy@panasas.com> wrote:
> On 2010-10-07 15:37, andros@netapp.com wrote:
>> From: Andy Adamson <andros@netapp.com>
>>
>> Signed-off-by: Andy Adamson <andros@netapp.com>
>> ---
>>  fs/nfs/nfs4filelayoutdev.c |    5 -----
>>  fs/nfs/nfs4state.c         |    5 +++++
>>  2 files changed, 5 insertions(+), 5 deletions(-)
>>
>> diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c
>> index e0edf93..1f0ab62 100644
>> --- a/fs/nfs/nfs4filelayoutdev.c
>> +++ b/fs/nfs/nfs4filelayoutdev.c
>> @@ -183,11 +183,6 @@ nfs4_pnfs_ds_create(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds)
>>               goto out_put;
>>       }
>>       /*
>> -      * Mask the (possibly) returned EXCHGID4_FLAG_USE_PNFS_MDS pNFS role
>> -      * The is_ds_only_session depends on this.
>> -      */
>> -     clp->cl_exchange_flags &= ~EXCHGID4_FLAG_USE_PNFS_MDS;
>> -     /*
>>        * Set DS lease equal to the MDS lease, renewal is scheduled in
>>        * create_session
>>        */
>> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
>> index 91584ad..e2fc175 100644
>> --- a/fs/nfs/nfs4state.c
>> +++ b/fs/nfs/nfs4state.c
>> @@ -188,6 +188,7 @@ static int nfs4_begin_drain_session(struct nfs_client *clp)
>>  int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
>>  {
>>       int status;
>> +     u32 req_exchange_flags = clp->cl_exchange_flags;
>>
>>       nfs4_begin_drain_session(clp);
>>       status = nfs4_proc_exchange_id(clp, cred);
>> @@ -196,6 +197,10 @@ int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
>>       status = nfs4_proc_create_session(clp);
>>       if (status != 0)
>>               goto out;
>> +     if (is_ds_only_session(req_exchange_flags))
>> +             /* Mask the (possibly) returned MDS and non-pNFS roles */
>
> This comment does not really add anything substantial that the code doesn't tell you :)
>
>> +             clp->cl_exchange_flags &=
>> +                  ~(EXCHGID4_FLAG_USE_PNFS_MDS | EXCHGID4_FLAG_USE_NON_PNFS);
>
> I'm not why you want to mask out EXCHGID4_FLAG_USE_NON_PNFS.
> If the server is not a DS why not just return an error?

We *know* _USE_PNFS_DS is set.  We just want to mask out
_USE_NON_PNFS, which  would indicate it is also a 4.0 server.

Fred

>
> Benny
>
>>       nfs41_setup_state_renewal(clp);
>>       nfs_mark_client_ready(clp, NFS_CS_READY);
>>  out:
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] pnfs_submit: enforce requested DS only pNFS role
  2010-10-07 18:10       ` Fred Isaman
@ 2010-10-07 18:12         ` Fred Isaman
  0 siblings, 0 replies; 13+ messages in thread
From: Fred Isaman @ 2010-10-07 18:12 UTC (permalink / raw)
  To: Benny Halevy; +Cc: andros, linux-nfs

On Thu, Oct 7, 2010 at 2:10 PM, Fred Isaman <iisaman@netapp.com> wrote:
> On Thu, Oct 7, 2010 at 1:06 PM, Benny Halevy <bhalevy@panasas.com> wrote:
>> On 2010-10-07 15:37, andros@netapp.com wrote:
>>> From: Andy Adamson <andros@netapp.com>
>>>
>>> Signed-off-by: Andy Adamson <andros@netapp.com>
>>> ---
>>>  fs/nfs/nfs4filelayoutdev.c |    5 -----
>>>  fs/nfs/nfs4state.c         |    5 +++++
>>>  2 files changed, 5 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c
>>> index e0edf93..1f0ab62 100644
>>> --- a/fs/nfs/nfs4filelayoutdev.c
>>> +++ b/fs/nfs/nfs4filelayoutdev.c
>>> @@ -183,11 +183,6 @@ nfs4_pnfs_ds_create(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds)
>>>               goto out_put;
>>>       }
>>>       /*
>>> -      * Mask the (possibly) returned EXCHGID4_FLAG_USE_PNFS_MDS pNFS role
>>> -      * The is_ds_only_session depends on this.
>>> -      */
>>> -     clp->cl_exchange_flags &= ~EXCHGID4_FLAG_USE_PNFS_MDS;
>>> -     /*
>>>        * Set DS lease equal to the MDS lease, renewal is scheduled in
>>>        * create_session
>>>        */
>>> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
>>> index 91584ad..e2fc175 100644
>>> --- a/fs/nfs/nfs4state.c
>>> +++ b/fs/nfs/nfs4state.c
>>> @@ -188,6 +188,7 @@ static int nfs4_begin_drain_session(struct nfs_client *clp)
>>>  int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
>>>  {
>>>       int status;
>>> +     u32 req_exchange_flags = clp->cl_exchange_flags;
>>>
>>>       nfs4_begin_drain_session(clp);
>>>       status = nfs4_proc_exchange_id(clp, cred);
>>> @@ -196,6 +197,10 @@ int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
>>>       status = nfs4_proc_create_session(clp);
>>>       if (status != 0)
>>>               goto out;
>>> +     if (is_ds_only_session(req_exchange_flags))
>>> +             /* Mask the (possibly) returned MDS and non-pNFS roles */
>>
>> This comment does not really add anything substantial that the code doesn't tell you :)
>>
>>> +             clp->cl_exchange_flags &=
>>> +                  ~(EXCHGID4_FLAG_USE_PNFS_MDS | EXCHGID4_FLAG_USE_NON_PNFS);
>>
>> I'm not why you want to mask out EXCHGID4_FLAG_USE_NON_PNFS.
>> If the server is not a DS why not just return an error?
>
> We *know* _USE_PNFS_DS is set.  We just want to mask out
> _USE_NON_PNFS, which  would indicate it is also a 4.0 server.
>

Oops...we *know* _PNFS_DS is set in req_exchange_flags.  As you point
out, we would like to know it is in the reply.

Fred

> Fred
>
>>
>> Benny
>>
>>>       nfs41_setup_state_renewal(clp);
>>>       nfs_mark_client_ready(clp, NFS_CS_READY);
>>>  out:
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>
>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] pnfs_submit: enforce requested DS only pNFS role
  2010-10-07 18:08       ` Benny Halevy
@ 2010-10-07 18:41         ` Benny Halevy
  2010-10-07 19:23           ` Benny Halevy
  0 siblings, 1 reply; 13+ messages in thread
From: Benny Halevy @ 2010-10-07 18:41 UTC (permalink / raw)
  To: andros; +Cc: linux-nfs, Fred Isaman

On 2010-10-07 14:08, Benny Halevy wrote:
> On 2010-10-07 13:06, Benny Halevy wrote:
>> On 2010-10-07 15:37, andros@netapp.com wrote:
>>> From: Andy Adamson <andros@netapp.com>
>>>
>>> Signed-off-by: Andy Adamson <andros@netapp.com>
>>> ---
>>>  fs/nfs/nfs4filelayoutdev.c |    5 -----
>>>  fs/nfs/nfs4state.c         |    5 +++++
>>>  2 files changed, 5 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c
>>> index e0edf93..1f0ab62 100644
>>> --- a/fs/nfs/nfs4filelayoutdev.c
>>> +++ b/fs/nfs/nfs4filelayoutdev.c
>>> @@ -183,11 +183,6 @@ nfs4_pnfs_ds_create(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds)
>>>  		goto out_put;
>>>  	}
>>>  	/*
>>> -	 * Mask the (possibly) returned EXCHGID4_FLAG_USE_PNFS_MDS pNFS role
>>> -	 * The is_ds_only_session depends on this.
>>> -	 */
>>> -	clp->cl_exchange_flags &= ~EXCHGID4_FLAG_USE_PNFS_MDS;
>>> -	/*
>>>  	 * Set DS lease equal to the MDS lease, renewal is scheduled in
>>>  	 * create_session
>>>  	 */
>>> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
>>> index 91584ad..e2fc175 100644
>>> --- a/fs/nfs/nfs4state.c
>>> +++ b/fs/nfs/nfs4state.c
>>> @@ -188,6 +188,7 @@ static int nfs4_begin_drain_session(struct nfs_client *clp)
>>>  int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
>>>  {
>>>  	int status;
>>> +	u32 req_exchange_flags = clp->cl_exchange_flags;
>>>  
>>>  	nfs4_begin_drain_session(clp);
>>>  	status = nfs4_proc_exchange_id(clp, cred);
>>> @@ -196,6 +197,10 @@ int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
>>>  	status = nfs4_proc_create_session(clp);
>>>  	if (status != 0)
>>>  		goto out;
>>> +	if (is_ds_only_session(req_exchange_flags))
>>> +		/* Mask the (possibly) returned MDS and non-pNFS roles */
>>
>> This comment does not really add anything substantial that the code doesn't tell you :)
>>
>>> +		clp->cl_exchange_flags &=
>>> +		     ~(EXCHGID4_FLAG_USE_PNFS_MDS | EXCHGID4_FLAG_USE_NON_PNFS);
>>
>> I'm not why you want to mask out EXCHGID4_FLAG_USE_NON_PNFS.
>> If the server is not a DS why not just return an error?
> 
> So Andy convinced me and the spec. says that USE_PNFS_DS | USE_NON_PNFS
> is a valid response.
> However, if USE_PNFS_DS is unset in the response in this case
> we need not create the client and better return an error.
> I'll send a patch that does that.

So this is what I have in mind:

diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index e2fc175..4723c41 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -197,10 +197,14 @@ int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
 	status = nfs4_proc_create_session(clp);
 	if (status != 0)
 		goto out;
-	if (is_ds_only_session(req_exchange_flags))
-		/* Mask the (possibly) returned MDS and non-pNFS roles */
+	if (is_ds_only_session(req_exchange_flags)) {
 		clp->cl_exchange_flags &=
 		     ~(EXCHGID4_FLAG_USE_PNFS_MDS | EXCHGID4_FLAG_USE_NON_PNFS);
+		if (!is_ds_only_session(clp->cl_exchange_flags)) {
+			nfs4_proc_destroy_session(clp);
+			status = -ENOTSUPP;
+		}
+	}
 	nfs41_setup_state_renewal(clp);
 	nfs_mark_client_ready(clp, NFS_CS_READY);
 out:

> 
> Benny
> 
>>
>> Benny
>>
>>>  	nfs41_setup_state_renewal(clp);
>>>  	nfs_mark_client_ready(clp, NFS_CS_READY);
>>>  out:
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


-- 
Benny Halevy
Software Architect
Panasas, Inc.
bhalevy@panasas.com
Tel/Fax: +972-3-647-8340
Mobile: +972-54-802-8340

Panasas: The Leader in Parallel Storage
www.panasas.com

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/3] pnfs_submit: move layout segment valid test
  2010-10-07 19:37 [PATCH 1/3] pnfs_submit: move layout segment valid test andros
@ 2010-10-07 18:52 ` Benny Halevy
  2010-10-07 19:17   ` [PATCH 1/1] SQUASHME: pnfs-submit: do not get_lseg in pnfs_has_layout Benny Halevy
                     ` (2 more replies)
  2010-10-07 19:37 ` [PATCH 2/3] pnfs_submit: fix deadlock in pnfs_clear_lseg_list andros
  1 sibling, 3 replies; 13+ messages in thread
From: Benny Halevy @ 2010-10-07 18:52 UTC (permalink / raw)
  To: andros; +Cc: linux-nfs

On 2010-10-07 15:37, andros@netapp.com wrote:
> From: Andy Adamson <andros@rhel6-1.androsmac.org>
> 
> Do not get_lseg for a non-valid lseg.
> Prepare for calling put_lseg outside of inode i_lock.
> 
> Signed-off-by: Andy Adamson <andros@netapp.com>
> ---
>  fs/nfs/pnfs.c |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> index 6b2a95d..24620cf 100644
> --- a/fs/nfs/pnfs.c
> +++ b/fs/nfs/pnfs.c
> @@ -845,7 +845,8 @@ pnfs_has_layout(struct pnfs_layout_hdr *lo,
>  	list_for_each_entry(lseg, &lo->segs, fi_list) {
>  		if (is_matching_lseg(lseg, range)) {
>  			ret = lseg;
> -			get_lseg(ret);
> +			if (lseg->valid)
> +				get_lseg(ret);

We shouldn't be hiding this inside pnfs_has_layout
and have different side effects in the different cases.
Since we're called under the lock, pnfs_has_layout
can just return the lseg and never get a reference and its
caller can take it if necessary before releasing the lock.

Also, it doesn't need to be EXPORT_SYMBOL_GPLed as it's
not used outside of the nfs client module.

Benny

>  			break;
>  		}
>  		if (cmp_layout(range, &lseg->range) > 0)
> @@ -889,7 +890,6 @@ pnfs_update_layout(struct inode *ino,
>  	/* Check to see if the layout for the given range already exists */
>  	lseg = pnfs_has_layout(lo, &arg);
>  	if (lseg && !lseg->valid) {
> -		put_lseg_locked(lseg);
>  		/* someone is cleaning the layout */
>  		lseg = NULL;
>  		goto out_unlock;

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 1/1] SQUASHME: pnfs-submit: do not get_lseg in pnfs_has_layout
  2010-10-07 18:52 ` Benny Halevy
@ 2010-10-07 19:17   ` Benny Halevy
  2010-10-07 19:17   ` [PATCH 2/2] SQUASHME: pnfs: get_lseg in nfs4_layoutget_prepare rather than " Benny Halevy
  2010-10-07 19:28   ` [PATCH 1/3] pnfs_submit: move layout segment valid test William A. (Andy) Adamson
  2 siblings, 0 replies; 13+ messages in thread
From: Benny Halevy @ 2010-10-07 19:17 UTC (permalink / raw)
  To: linux-nfs

let its caller do that if necessary

Signed-off-by: Benny Halevy <bhalevy@panasas.com>
---
 fs/nfs/pnfs.c |    4 +---
 1 files changed, 1 insertions(+), 3 deletions(-)

diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 40d1dc6..a27df2b 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -844,8 +844,6 @@ pnfs_has_layout(struct pnfs_layout_hdr *lo,
 	list_for_each_entry(lseg, &lo->segs, fi_list) {
 		if (is_matching_lseg(lseg, range)) {
 			ret = lseg;
-			if (lseg->valid)
-				get_lseg(ret);
 			break;
 		}
 		if (cmp_layout(range, &lseg->range) > 0)
@@ -857,7 +855,6 @@ pnfs_has_layout(struct pnfs_layout_hdr *lo,
 		ret ? ret->valid : 0);
 	return ret;
 }
-EXPORT_SYMBOL_GPL(pnfs_has_layout);
 
 /*
  * Layout segment is retreived from the server if not cached.
@@ -897,6 +894,7 @@ pnfs_update_layout(struct inode *ino,
 	if (lseg) {
 		dprintk("%s: Using cached lseg %p for iomode %d)\n",
 			__func__, lseg, iomode);
+		get_lseg(lseg);
 		goto out_unlock;
 	}
 
-- 
1.7.2.3


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 2/2] SQUASHME: pnfs: get_lseg in nfs4_layoutget_prepare rather than in pnfs_has_layout
  2010-10-07 18:52 ` Benny Halevy
  2010-10-07 19:17   ` [PATCH 1/1] SQUASHME: pnfs-submit: do not get_lseg in pnfs_has_layout Benny Halevy
@ 2010-10-07 19:17   ` Benny Halevy
  2010-10-07 19:28   ` [PATCH 1/3] pnfs_submit: move layout segment valid test William A. (Andy) Adamson
  2 siblings, 0 replies; 13+ messages in thread
From: Benny Halevy @ 2010-10-07 19:17 UTC (permalink / raw)
  To: linux-nfs

pnfs_has_layout does not get_lref on its return value anymore

Signed-off-by: Benny Halevy <bhalevy@panasas.com>
---
 fs/nfs/nfs4proc.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 25bc169..97cc539 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -5442,12 +5442,12 @@ nfs4_layoutget_prepare(struct rpc_task *task, void *calldata)
 		return;
 	}
 	if (!lseg->valid) {
-		put_lseg_locked(lseg);
 		spin_unlock(&ino->i_lock);
 		dprintk("%s: invalid lseg found, waiting\n", __func__);
 		rpc_sleep_on(&nfsi->lo_rpcwaitq, task, NULL);
 		return;
 	}
+	get_lseg(lseg);
 	*lgp->lsegpp = lseg;
 	spin_unlock(&ino->i_lock);
 	dprintk("%s: valid lseg found, no rpc required\n", __func__);
-- 
1.7.2.3


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/3] pnfs_submit: enforce requested DS only pNFS role
  2010-10-07 18:41         ` Benny Halevy
@ 2010-10-07 19:23           ` Benny Halevy
  0 siblings, 0 replies; 13+ messages in thread
From: Benny Halevy @ 2010-10-07 19:23 UTC (permalink / raw)
  To: andros; +Cc: linux-nfs, Fred Isaman

On 2010-10-07 14:41, Benny Halevy wrote:
> On 2010-10-07 14:08, Benny Halevy wrote:
>> On 2010-10-07 13:06, Benny Halevy wrote:
>>> On 2010-10-07 15:37, andros@netapp.com wrote:
>>>> From: Andy Adamson <andros@netapp.com>
>>>>
>>>> Signed-off-by: Andy Adamson <andros@netapp.com>
>>>> ---
>>>>  fs/nfs/nfs4filelayoutdev.c |    5 -----
>>>>  fs/nfs/nfs4state.c         |    5 +++++
>>>>  2 files changed, 5 insertions(+), 5 deletions(-)
>>>>
>>>> diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c
>>>> index e0edf93..1f0ab62 100644
>>>> --- a/fs/nfs/nfs4filelayoutdev.c
>>>> +++ b/fs/nfs/nfs4filelayoutdev.c
>>>> @@ -183,11 +183,6 @@ nfs4_pnfs_ds_create(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds)
>>>>  		goto out_put;
>>>>  	}
>>>>  	/*
>>>> -	 * Mask the (possibly) returned EXCHGID4_FLAG_USE_PNFS_MDS pNFS role
>>>> -	 * The is_ds_only_session depends on this.
>>>> -	 */
>>>> -	clp->cl_exchange_flags &= ~EXCHGID4_FLAG_USE_PNFS_MDS;
>>>> -	/*
>>>>  	 * Set DS lease equal to the MDS lease, renewal is scheduled in
>>>>  	 * create_session
>>>>  	 */
>>>> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
>>>> index 91584ad..e2fc175 100644
>>>> --- a/fs/nfs/nfs4state.c
>>>> +++ b/fs/nfs/nfs4state.c
>>>> @@ -188,6 +188,7 @@ static int nfs4_begin_drain_session(struct nfs_client *clp)
>>>>  int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
>>>>  {
>>>>  	int status;
>>>> +	u32 req_exchange_flags = clp->cl_exchange_flags;
>>>>  
>>>>  	nfs4_begin_drain_session(clp);
>>>>  	status = nfs4_proc_exchange_id(clp, cred);
>>>> @@ -196,6 +197,10 @@ int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
>>>>  	status = nfs4_proc_create_session(clp);
>>>>  	if (status != 0)
>>>>  		goto out;
>>>> +	if (is_ds_only_session(req_exchange_flags))
>>>> +		/* Mask the (possibly) returned MDS and non-pNFS roles */
>>>
>>> This comment does not really add anything substantial that the code doesn't tell you :)
>>>
>>>> +		clp->cl_exchange_flags &=
>>>> +		     ~(EXCHGID4_FLAG_USE_PNFS_MDS | EXCHGID4_FLAG_USE_NON_PNFS);
>>>
>>> I'm not why you want to mask out EXCHGID4_FLAG_USE_NON_PNFS.
>>> If the server is not a DS why not just return an error?
>>
>> So Andy convinced me and the spec. says that USE_PNFS_DS | USE_NON_PNFS
>> is a valid response.
>> However, if USE_PNFS_DS is unset in the response in this case
>> we need not create the client and better return an error.
>> I'll send a patch that does that.
> 
> So this is what I have in mind:
> 
> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
> index e2fc175..4723c41 100644
> --- a/fs/nfs/nfs4state.c
> +++ b/fs/nfs/nfs4state.c
> @@ -197,10 +197,14 @@ int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
>  	status = nfs4_proc_create_session(clp);
>  	if (status != 0)
>  		goto out;
> -	if (is_ds_only_session(req_exchange_flags))
> -		/* Mask the (possibly) returned MDS and non-pNFS roles */
> +	if (is_ds_only_session(req_exchange_flags)) {
>  		clp->cl_exchange_flags &=
>  		     ~(EXCHGID4_FLAG_USE_PNFS_MDS | EXCHGID4_FLAG_USE_NON_PNFS);
> +		if (!is_ds_only_session(clp->cl_exchange_flags)) {
> +			nfs4_proc_destroy_session(clp);

This should be {
	nfs4_destroy_session(clp->cl_session);
	clp->cl_session = NULL;
}


> +			status = -ENOTSUPP;
> +		}
> +	}
>  	nfs41_setup_state_renewal(clp);
>  	nfs_mark_client_ready(clp, NFS_CS_READY);
>  out:
> 
>>
>> Benny
>>
>>>
>>> Benny
>>>
>>>>  	nfs41_setup_state_renewal(clp);
>>>>  	nfs_mark_client_ready(clp, NFS_CS_READY);
>>>>  out:
>>> --
>>> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
>>> the body of a message to majordomo@vger.kernel.org
>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/3] pnfs_submit: move layout segment valid test
  2010-10-07 18:52 ` Benny Halevy
  2010-10-07 19:17   ` [PATCH 1/1] SQUASHME: pnfs-submit: do not get_lseg in pnfs_has_layout Benny Halevy
  2010-10-07 19:17   ` [PATCH 2/2] SQUASHME: pnfs: get_lseg in nfs4_layoutget_prepare rather than " Benny Halevy
@ 2010-10-07 19:28   ` William A. (Andy) Adamson
  2 siblings, 0 replies; 13+ messages in thread
From: William A. (Andy) Adamson @ 2010-10-07 19:28 UTC (permalink / raw)
  To: Benny Halevy; +Cc: linux-nfs

On Thu, Oct 7, 2010 at 2:52 PM, Benny Halevy <bhalevy@panasas.com> wrote:
> On 2010-10-07 15:37, andros@netapp.com wrote:
>> From: Andy Adamson <andros@rhel6-1.androsmac.org>
>>
>> Do not get_lseg for a non-valid lseg.
>> Prepare for calling put_lseg outside of inode i_lock.
>>
>> Signed-off-by: Andy Adamson <andros@netapp.com>
>> ---
>>  fs/nfs/pnfs.c |    4 ++--
>>  1 files changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
>> index 6b2a95d..24620cf 100644
>> --- a/fs/nfs/pnfs.c
>> +++ b/fs/nfs/pnfs.c
>> @@ -845,7 +845,8 @@ pnfs_has_layout(struct pnfs_layout_hdr *lo,
>>       list_for_each_entry(lseg, &lo->segs, fi_list) {
>>               if (is_matching_lseg(lseg, range)) {
>>                       ret = lseg;
>> -                     get_lseg(ret);
>> +                     if (lseg->valid)
>> +                             get_lseg(ret);
>
> We shouldn't be hiding this inside pnfs_has_layout
> and have different side effects in the different cases.

Sorry - I just looked at the pnfs-submit branch. I should have looked
at the pnfs-all branch and seen the other callers of pnfs_has_layout.

> Since we're called under the lock, pnfs_has_layout
> can just return the lseg and never get a reference and its
> caller can take it if necessary before releasing the lock.
>
> Also, it doesn't need to be EXPORT_SYMBOL_GPLed as it's
> not used outside of the nfs client module.

Right - Fred just removed the call in the file layout driver.

I'll fix this.

-->Andy

>
> Benny
>
>>                       break;
>>               }
>>               if (cmp_layout(range, &lseg->range) > 0)
>> @@ -889,7 +890,6 @@ pnfs_update_layout(struct inode *ino,
>>       /* Check to see if the layout for the given range already exists */
>>       lseg = pnfs_has_layout(lo, &arg);
>>       if (lseg && !lseg->valid) {
>> -             put_lseg_locked(lseg);
>>               /* someone is cleaning the layout */
>>               lseg = NULL;
>>               goto out_unlock;
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 1/3] pnfs_submit: move layout segment valid test
@ 2010-10-07 19:37 andros
  2010-10-07 18:52 ` Benny Halevy
  2010-10-07 19:37 ` [PATCH 2/3] pnfs_submit: fix deadlock in pnfs_clear_lseg_list andros
  0 siblings, 2 replies; 13+ messages in thread
From: andros @ 2010-10-07 19:37 UTC (permalink / raw)
  To: bhalevy; +Cc: linux-nfs, Andy Adamson, Andy Adamson

From: Andy Adamson <andros@rhel6-1.androsmac.org>

Do not get_lseg for a non-valid lseg.
Prepare for calling put_lseg outside of inode i_lock.

Signed-off-by: Andy Adamson <andros@netapp.com>
---
 fs/nfs/pnfs.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 6b2a95d..24620cf 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -845,7 +845,8 @@ pnfs_has_layout(struct pnfs_layout_hdr *lo,
 	list_for_each_entry(lseg, &lo->segs, fi_list) {
 		if (is_matching_lseg(lseg, range)) {
 			ret = lseg;
-			get_lseg(ret);
+			if (lseg->valid)
+				get_lseg(ret);
 			break;
 		}
 		if (cmp_layout(range, &lseg->range) > 0)
@@ -889,7 +890,6 @@ pnfs_update_layout(struct inode *ino,
 	/* Check to see if the layout for the given range already exists */
 	lseg = pnfs_has_layout(lo, &arg);
 	if (lseg && !lseg->valid) {
-		put_lseg_locked(lseg);
 		/* someone is cleaning the layout */
 		lseg = NULL;
 		goto out_unlock;
-- 
1.6.6


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 2/3] pnfs_submit: fix deadlock in pnfs_clear_lseg_list
  2010-10-07 19:37 [PATCH 1/3] pnfs_submit: move layout segment valid test andros
  2010-10-07 18:52 ` Benny Halevy
@ 2010-10-07 19:37 ` andros
  2010-10-07 19:37   ` [PATCH 3/3] pnfs_submit: enforce requested DS only pNFS role andros
  1 sibling, 1 reply; 13+ messages in thread
From: andros @ 2010-10-07 19:37 UTC (permalink / raw)
  To: bhalevy; +Cc: linux-nfs, Andy Adamson, Andy Adamson

From: Andy Adamson <andros@rhel6-1.androsmac.org>

The file layout free_lseg i/o operation called by destroy_lseg under the
inode->i_lock can call nfs_put_client() when a data
server is no longer referenced. nfs_put_client can end up taking the
i_mutex called in rpc_unlink (called from nfs_idmap_delete from
nfs_free_client) which can result in a deadlock.

Use a temporary list to hold layout segments to be freed, and free them outside
the inode->i_lock.

Reported-by: Fred Isaman <iisaman@netapp.com>
Signed-off-by: Andy Adamson <andros@netapp.com>
---
 fs/nfs/pnfs.c |   53 ++++++++++++++++++++++++++---------------------------
 fs/nfs/pnfs.h |    1 -
 2 files changed, 26 insertions(+), 28 deletions(-)

diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 24620cf..06fcc92 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -275,6 +275,7 @@ init_lseg(struct pnfs_layout_hdr *lo, struct pnfs_layout_segment *lseg)
 	lseg->layout = lo;
 }
 
+/* Called without i_lock held */
 static void
 destroy_lseg(struct kref *kref)
 {
@@ -285,29 +286,10 @@ destroy_lseg(struct kref *kref)
 	dprintk("--> %s\n", __func__);
 	NFS_SERVER(local->inode)->pnfs_curr_ld->free_lseg(lseg);
 	/* Matched by get_layout_hdr_locked in pnfs_insert_layout */
-	put_layout_hdr_locked(local);
+	put_layout_hdr(local->inode);
 }
 
 void
-put_lseg_locked(struct pnfs_layout_segment *lseg)
-{
-	bool do_wake_up;
-	struct nfs_inode *nfsi;
-
-	if (!lseg)
-		return;
-
-	dprintk("%s: lseg %p ref %d valid %d\n", __func__, lseg,
-		atomic_read(&lseg->kref.refcount), lseg->valid);
-	do_wake_up = !lseg->valid;
-	nfsi = NFS_I(lseg->layout->inode);
-	kref_put(&lseg->kref, destroy_lseg);
-	if (do_wake_up)
-		wake_up(&nfsi->lo_waitq);
-}
-EXPORT_SYMBOL_GPL(put_lseg_locked);
-
-void
 put_lseg(struct pnfs_layout_segment *lseg)
 {
 	bool do_wake_up;
@@ -320,9 +302,7 @@ put_lseg(struct pnfs_layout_segment *lseg)
 		atomic_read(&lseg->kref.refcount), lseg->valid);
 	do_wake_up = !lseg->valid;
 	nfsi = NFS_I(lseg->layout->inode);
-	spin_lock(&nfsi->vfs_inode.i_lock);
 	kref_put(&lseg->kref, destroy_lseg);
-	spin_unlock(&nfsi->vfs_inode.i_lock);
 	if (do_wake_up)
 		wake_up(&nfsi->lo_waitq);
 }
@@ -354,10 +334,11 @@ _pnfs_can_return_lseg(struct pnfs_layout_segment *lseg)
 }
 
 static void
-pnfs_clear_lseg_list(struct pnfs_layout_hdr *lo,
+pnfs_clear_lseg_list(struct pnfs_layout_hdr *lo, struct list_head *tmp_list,
 		     struct pnfs_layout_range *range)
 {
 	struct pnfs_layout_segment *lseg, *next;
+
 	dprintk("%s:Begin lo %p offset %llu length %llu iomode %d\n",
 		__func__, lo, range->offset, range->length, range->iomode);
 
@@ -370,8 +351,7 @@ pnfs_clear_lseg_list(struct pnfs_layout_hdr *lo,
 			"offset %llu length %llu\n", __func__,
 			lseg, lseg->range.iomode, lseg->range.offset,
 			lseg->range.length);
-		list_del(&lseg->fi_list);
-		put_lseg_locked(lseg);
+		list_move(&lseg->fi_list, tmp_list);
 	}
 	if (list_empty(&lo->segs)) {
 		struct nfs_client *clp;
@@ -387,6 +367,21 @@ pnfs_clear_lseg_list(struct pnfs_layout_hdr *lo,
 	dprintk("%s:Return\n", __func__);
 }
 
+static void
+pnfs_free_lseg_list(struct list_head *tmp_list)
+{
+	struct pnfs_layout_segment *lseg;
+
+	while (!list_empty(tmp_list)) {
+		lseg = list_entry(tmp_list->next, struct pnfs_layout_segment,
+				fi_list);
+		dprintk("%s calling put_lseg on %p\n", __func__, lseg);
+		list_del(&lseg->fi_list);
+		put_lseg(lseg);
+	}
+}
+
+
 void
 pnfs_layoutget_release(struct pnfs_layout_hdr *lo)
 {
@@ -403,12 +398,14 @@ pnfs_layoutreturn_release(struct pnfs_layout_hdr *lo,
 			  struct pnfs_layout_range *range)
 {
 	struct nfs_inode *nfsi = NFS_I(lo->inode);
+	LIST_HEAD(tmp_list);
 
 	spin_lock(&nfsi->vfs_inode.i_lock);
 	if (range)
-		pnfs_clear_lseg_list(lo, range);
+		pnfs_clear_lseg_list(lo, &tmp_list, range);
 	put_layout_hdr_locked(lo); /* Matched in _pnfs_return_layout */
 	spin_unlock(&nfsi->vfs_inode.i_lock);
+	pnfs_free_lseg_list(&tmp_list);
 	wake_up_all(&nfsi->lo_waitq);
 }
 
@@ -421,11 +418,12 @@ pnfs_destroy_layout(struct nfs_inode *nfsi)
 		.offset = 0,
 		.length = NFS4_MAX_UINT64,
 	};
+	LIST_HEAD(tmp_list);
 
 	spin_lock(&nfsi->vfs_inode.i_lock);
 	lo = nfsi->layout;
 	if (lo) {
-		pnfs_clear_lseg_list(lo, &range);
+		pnfs_clear_lseg_list(lo, &tmp_list,  &range);
 		WARN_ON(!list_empty(&nfsi->layout->segs));
 		WARN_ON(!list_empty(&nfsi->layout->layouts));
 		WARN_ON(nfsi->layout->refcount != 1);
@@ -434,6 +432,7 @@ pnfs_destroy_layout(struct nfs_inode *nfsi)
 		put_layout_hdr_locked(lo);
 	}
 	spin_unlock(&nfsi->vfs_inode.i_lock);
+	pnfs_free_lseg_list(&tmp_list);
 }
 
 /*
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index 1b1efcd..51f717d 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -177,7 +177,6 @@ extern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool wait);
 
 /* pnfs.c */
 void put_lseg(struct pnfs_layout_segment *lseg);
-void put_lseg_locked(struct pnfs_layout_segment *lseg);
 struct pnfs_layout_segment *
 pnfs_has_layout(struct pnfs_layout_hdr *lo, struct pnfs_layout_range *range);
 struct pnfs_layout_segment *
-- 
1.6.6


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 3/3] pnfs_submit: enforce requested DS only pNFS role
  2010-10-07 19:37 ` [PATCH 2/3] pnfs_submit: fix deadlock in pnfs_clear_lseg_list andros
@ 2010-10-07 19:37   ` andros
  2010-10-07 17:06     ` Benny Halevy
  0 siblings, 1 reply; 13+ messages in thread
From: andros @ 2010-10-07 19:37 UTC (permalink / raw)
  To: bhalevy; +Cc: linux-nfs, Andy Adamson

From: Andy Adamson <andros@netapp.com>

Signed-off-by: Andy Adamson <andros@netapp.com>
---
 fs/nfs/nfs4filelayoutdev.c |    5 -----
 fs/nfs/nfs4state.c         |    5 +++++
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c
index e0edf93..1f0ab62 100644
--- a/fs/nfs/nfs4filelayoutdev.c
+++ b/fs/nfs/nfs4filelayoutdev.c
@@ -183,11 +183,6 @@ nfs4_pnfs_ds_create(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds)
 		goto out_put;
 	}
 	/*
-	 * Mask the (possibly) returned EXCHGID4_FLAG_USE_PNFS_MDS pNFS role
-	 * The is_ds_only_session depends on this.
-	 */
-	clp->cl_exchange_flags &= ~EXCHGID4_FLAG_USE_PNFS_MDS;
-	/*
 	 * Set DS lease equal to the MDS lease, renewal is scheduled in
 	 * create_session
 	 */
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index 91584ad..e2fc175 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -188,6 +188,7 @@ static int nfs4_begin_drain_session(struct nfs_client *clp)
 int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
 {
 	int status;
+	u32 req_exchange_flags = clp->cl_exchange_flags;
 
 	nfs4_begin_drain_session(clp);
 	status = nfs4_proc_exchange_id(clp, cred);
@@ -196,6 +197,10 @@ int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
 	status = nfs4_proc_create_session(clp);
 	if (status != 0)
 		goto out;
+	if (is_ds_only_session(req_exchange_flags))
+		/* Mask the (possibly) returned MDS and non-pNFS roles */
+		clp->cl_exchange_flags &=
+		     ~(EXCHGID4_FLAG_USE_PNFS_MDS | EXCHGID4_FLAG_USE_NON_PNFS);
 	nfs41_setup_state_renewal(clp);
 	nfs_mark_client_ready(clp, NFS_CS_READY);
 out:
-- 
1.6.6


^ permalink raw reply related	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2010-10-07 19:28 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-10-07 19:37 [PATCH 1/3] pnfs_submit: move layout segment valid test andros
2010-10-07 18:52 ` Benny Halevy
2010-10-07 19:17   ` [PATCH 1/1] SQUASHME: pnfs-submit: do not get_lseg in pnfs_has_layout Benny Halevy
2010-10-07 19:17   ` [PATCH 2/2] SQUASHME: pnfs: get_lseg in nfs4_layoutget_prepare rather than " Benny Halevy
2010-10-07 19:28   ` [PATCH 1/3] pnfs_submit: move layout segment valid test William A. (Andy) Adamson
2010-10-07 19:37 ` [PATCH 2/3] pnfs_submit: fix deadlock in pnfs_clear_lseg_list andros
2010-10-07 19:37   ` [PATCH 3/3] pnfs_submit: enforce requested DS only pNFS role andros
2010-10-07 17:06     ` Benny Halevy
2010-10-07 18:08       ` Benny Halevy
2010-10-07 18:41         ` Benny Halevy
2010-10-07 19:23           ` Benny Halevy
2010-10-07 18:10       ` Fred Isaman
2010-10-07 18:12         ` Fred Isaman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).