diff mbox series

[RFC,v15,04/11] NFSD: Update nfsd_breaker_owns_lease() to handle courtesy clients

Message ID 1646440633-3542-5-git-send-email-dai.ngo@oracle.com (mailing list archive)
State New, archived
Headers show
Series NFSD: Initial implementation of NFSv4 Courteous Server | expand

Commit Message

Dai Ngo March 5, 2022, 12:37 a.m. UTC
Update nfsd_breaker_owns_lease() to handle delegation conflict
with courtesy clients. If conflict was caused courtesy client
then discard the courtesy client by setting CLIENT_EXPIRED and
return conflict resolved. Client with CLIENT_EXPIRED is expired
by the laundromat.

Signed-off-by: Dai Ngo <dai.ngo@oracle.com>
---
 fs/nfsd/nfs4state.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

Comments

Chuck Lever March 9, 2022, 9:46 p.m. UTC | #1
> On Mar 4, 2022, at 7:37 PM, Dai Ngo <dai.ngo@oracle.com> wrote:
> 
> Update nfsd_breaker_owns_lease() to handle delegation conflict
> with courtesy clients. If conflict was caused courtesy client
> then discard the courtesy client by setting CLIENT_EXPIRED and
> return conflict resolved. Client with CLIENT_EXPIRED is expired
> by the laundromat.
> 
> Signed-off-by: Dai Ngo <dai.ngo@oracle.com>
> ---
> fs/nfsd/nfs4state.c | 18 ++++++++++++++++++
> 1 file changed, 18 insertions(+)
> 
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index 583ac807e98d..40a357fd1a14 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -4727,6 +4727,24 @@ static bool nfsd_breaker_owns_lease(struct file_lock *fl)
> 	struct svc_rqst *rqst;
> 	struct nfs4_client *clp;
> 
> +	clp = dl->dl_stid.sc_client;
> +	/*
> +	 * need to sync with courtesy client trying to reconnect using
> +	 * the cl_cs_lock, nn->client_lock can not be used since this
> +	 * function is called with the fl_lck held.
> +	 */
> +	spin_lock(&clp->cl_cs_lock);
> +	if (test_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags)) {
> +		spin_unlock(&clp->cl_cs_lock);
> +		return true;
> +	}
> +	if (test_bit(NFSD4_CLIENT_COURTESY, &clp->cl_flags)) {
> +		set_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags);
> +		spin_unlock(&clp->cl_cs_lock);
> +		return true;
> +	}
> +	spin_unlock(&clp->cl_cs_lock);
> +

Nit: Please add nfs4_check_and_expire_courtesy_client() in this patch
instead of in 05/11.


> 	if (!i_am_nfsd())
> 		return false;
> 	rqst = kthread_data(current);
> -- 
> 2.9.5
> 

--
Chuck Lever
Dai Ngo March 10, 2022, 5:09 a.m. UTC | #2
On 3/9/22 1:46 PM, Chuck Lever III wrote:
>
>> On Mar 4, 2022, at 7:37 PM, Dai Ngo <dai.ngo@oracle.com> wrote:
>>
>> Update nfsd_breaker_owns_lease() to handle delegation conflict
>> with courtesy clients. If conflict was caused courtesy client
>> then discard the courtesy client by setting CLIENT_EXPIRED and
>> return conflict resolved. Client with CLIENT_EXPIRED is expired
>> by the laundromat.
>>
>> Signed-off-by: Dai Ngo <dai.ngo@oracle.com>
>> ---
>> fs/nfsd/nfs4state.c | 18 ++++++++++++++++++
>> 1 file changed, 18 insertions(+)
>>
>> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
>> index 583ac807e98d..40a357fd1a14 100644
>> --- a/fs/nfsd/nfs4state.c
>> +++ b/fs/nfsd/nfs4state.c
>> @@ -4727,6 +4727,24 @@ static bool nfsd_breaker_owns_lease(struct file_lock *fl)
>> 	struct svc_rqst *rqst;
>> 	struct nfs4_client *clp;
>>
>> +	clp = dl->dl_stid.sc_client;
>> +	/*
>> +	 * need to sync with courtesy client trying to reconnect using
>> +	 * the cl_cs_lock, nn->client_lock can not be used since this
>> +	 * function is called with the fl_lck held.
>> +	 */
>> +	spin_lock(&clp->cl_cs_lock);
>> +	if (test_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags)) {
>> +		spin_unlock(&clp->cl_cs_lock);
>> +		return true;
>> +	}
>> +	if (test_bit(NFSD4_CLIENT_COURTESY, &clp->cl_flags)) {
>> +		set_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags);
>> +		spin_unlock(&clp->cl_cs_lock);
>> +		return true;
>> +	}
>> +	spin_unlock(&clp->cl_cs_lock);
>> +
> Nit: Please add nfs4_check_and_expire_courtesy_client() in this patch
> instead of in 05/11.

That means nfs4_check_and_expire_courtesy_client is being called
in 05/11 but is not defined in 05/11. Is that ok?

-Dai

>
>
>> 	if (!i_am_nfsd())
>> 		return false;
>> 	rqst = kthread_data(current);
>> -- 
>> 2.9.5
>>
> --
> Chuck Lever
>
>
>
Chuck Lever March 10, 2022, 2:02 p.m. UTC | #3
> On Mar 10, 2022, at 12:09 AM, Dai Ngo <dai.ngo@oracle.com> wrote:
> 
> 
> On 3/9/22 1:46 PM, Chuck Lever III wrote:
>> 
>>> On Mar 4, 2022, at 7:37 PM, Dai Ngo <dai.ngo@oracle.com> wrote:
>>> 
>>> Update nfsd_breaker_owns_lease() to handle delegation conflict
>>> with courtesy clients. If conflict was caused courtesy client
>>> then discard the courtesy client by setting CLIENT_EXPIRED and
>>> return conflict resolved. Client with CLIENT_EXPIRED is expired
>>> by the laundromat.
>>> 
>>> Signed-off-by: Dai Ngo <dai.ngo@oracle.com>
>>> ---
>>> fs/nfsd/nfs4state.c | 18 ++++++++++++++++++
>>> 1 file changed, 18 insertions(+)
>>> 
>>> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
>>> index 583ac807e98d..40a357fd1a14 100644
>>> --- a/fs/nfsd/nfs4state.c
>>> +++ b/fs/nfsd/nfs4state.c
>>> @@ -4727,6 +4727,24 @@ static bool nfsd_breaker_owns_lease(struct file_lock *fl)
>>> 	struct svc_rqst *rqst;
>>> 	struct nfs4_client *clp;
>>> 
>>> +	clp = dl->dl_stid.sc_client;
>>> +	/*
>>> +	 * need to sync with courtesy client trying to reconnect using
>>> +	 * the cl_cs_lock, nn->client_lock can not be used since this
>>> +	 * function is called with the fl_lck held.
>>> +	 */
>>> +	spin_lock(&clp->cl_cs_lock);
>>> +	if (test_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags)) {
>>> +		spin_unlock(&clp->cl_cs_lock);
>>> +		return true;
>>> +	}
>>> +	if (test_bit(NFSD4_CLIENT_COURTESY, &clp->cl_flags)) {
>>> +		set_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags);
>>> +		spin_unlock(&clp->cl_cs_lock);
>>> +		return true;
>>> +	}
>>> +	spin_unlock(&clp->cl_cs_lock);
>>> +
>> Nit: Please add nfs4_check_and_expire_courtesy_client() in this patch
>> instead of in 05/11.
> 
> That means nfs4_check_and_expire_courtesy_client is being called
> in 05/11 but is not defined in 05/11. Is that ok?

I thought I saw a hunk in 5/11 that converts nfsd_breaker_owns_lease()
to use nfs4_check_and_expire_courtesy_client().

If so, I prefer if you add nfs4_check_and_expire_courtesy_client() in
this patch, and call it from nfsd_breaker_owns_lease(). Then the
additional clean-up in 5/11 isn't needed.

Again, this is a nit. But since you are driving a v16 soon anyway,
I'd like the patches changed before they are merged.


> -Dai
> 
>> 
>> 
>>> 	if (!i_am_nfsd())
>>> 		return false;
>>> 	rqst = kthread_data(current);
>>> -- 
>>> 2.9.5
>>> 
>> --
>> Chuck Lever
>> 
>> 
>> 

--
Chuck Lever
diff mbox series

Patch

diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 583ac807e98d..40a357fd1a14 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -4727,6 +4727,24 @@  static bool nfsd_breaker_owns_lease(struct file_lock *fl)
 	struct svc_rqst *rqst;
 	struct nfs4_client *clp;
 
+	clp = dl->dl_stid.sc_client;
+	/*
+	 * need to sync with courtesy client trying to reconnect using
+	 * the cl_cs_lock, nn->client_lock can not be used since this
+	 * function is called with the fl_lck held.
+	 */
+	spin_lock(&clp->cl_cs_lock);
+	if (test_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags)) {
+		spin_unlock(&clp->cl_cs_lock);
+		return true;
+	}
+	if (test_bit(NFSD4_CLIENT_COURTESY, &clp->cl_flags)) {
+		set_bit(NFSD4_CLIENT_EXPIRED, &clp->cl_flags);
+		spin_unlock(&clp->cl_cs_lock);
+		return true;
+	}
+	spin_unlock(&clp->cl_cs_lock);
+
 	if (!i_am_nfsd())
 		return false;
 	rqst = kthread_data(current);