diff mbox

[1/1] Fixing lease renewal

Message ID 1411574911-19269-1-git-send-email-kolga@netapp.com (mailing list archive)
State New, archived
Headers show

Commit Message

Olga Kornievskaia Sept. 24, 2014, 4:08 p.m. UTC
Commit c9fdeb28 removed a 'continue' after checking if the lease needs
to be renewed. However, if client hasn't moved, the code falls down to
starting reboot recovery erroneously (ie., sends open reclaim and gets
back stale_clientid error) before recovering from getting stale_clientid
on the renew operation.

Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
---
 fs/nfs/nfs4state.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Trond Myklebust Sept. 24, 2014, 6:05 p.m. UTC | #1
Hi Olga,

On Wed, Sep 24, 2014 at 12:08 PM, Olga Kornievskaia <kolga@netapp.com> wrote:
> Commit c9fdeb28 removed a 'continue' after checking if the lease needs
> to be renewed. However, if client hasn't moved, the code falls down to
> starting reboot recovery erroneously (ie., sends open reclaim and gets
> back stale_clientid error) before recovering from getting stale_clientid
> on the renew operation.
>
> Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
> ---
>  fs/nfs/nfs4state.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
> index 22fe351..4616598 100644
> --- a/fs/nfs/nfs4state.c
> +++ b/fs/nfs/nfs4state.c
> @@ -2340,11 +2340,13 @@ static void nfs4_state_manager(struct nfs_client *clp)
>                         continue;
>                 }
>
> -               if (test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
> +               if (!test_bit(NFS4CLNT_MOVED, &clp->cl_state) &&
> +                    test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
>                         section = "check lease";
>                         status = nfs4_check_lease(clp);
>                         if (status < 0)
>                                 goto out_error;
> +                       continue;
>                 }
>
>                 if (test_and_clear_bit(NFS4CLNT_MOVED, &clp->cl_state)) {
> --
> 1.8.5.2 (Apple Git-48)
>

I think you misunderstood me. I was proposing that we move the entire
code section that currently reads

                if (test_and_clear_bit(NFS4CLNT_MOVED, &clp->cl_state)) {
                        section = "migration";
                        status = nfs4_handle_migration(clp);
                        if (status < 0)
                                goto out_error;
                }

so that it occurs before the section

                if (test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
                        section = "check lease";
                        status = nfs4_check_lease(clp);
                        if (status < 0)
                                goto out_error;
+                      continue;
                }

That way we only need to test once for NFS4CLNT_MOVED.

Cheers
  Trond
Olga Kornievskaia Sept. 24, 2014, 6:21 p.m. UTC | #2
I have misunderstood you. One more try coming up.

On Wed, Sep 24, 2014 at 2:05 PM, Trond Myklebust
<trond.myklebust@primarydata.com> wrote:
> Hi Olga,
>
> On Wed, Sep 24, 2014 at 12:08 PM, Olga Kornievskaia <kolga@netapp.com> wrote:
>> Commit c9fdeb28 removed a 'continue' after checking if the lease needs
>> to be renewed. However, if client hasn't moved, the code falls down to
>> starting reboot recovery erroneously (ie., sends open reclaim and gets
>> back stale_clientid error) before recovering from getting stale_clientid
>> on the renew operation.
>>
>> Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
>> ---
>>  fs/nfs/nfs4state.c | 4 +++-
>>  1 file changed, 3 insertions(+), 1 deletion(-)
>>
>> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
>> index 22fe351..4616598 100644
>> --- a/fs/nfs/nfs4state.c
>> +++ b/fs/nfs/nfs4state.c
>> @@ -2340,11 +2340,13 @@ static void nfs4_state_manager(struct nfs_client *clp)
>>                         continue;
>>                 }
>>
>> -               if (test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
>> +               if (!test_bit(NFS4CLNT_MOVED, &clp->cl_state) &&
>> +                    test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
>>                         section = "check lease";
>>                         status = nfs4_check_lease(clp);
>>                         if (status < 0)
>>                                 goto out_error;
>> +                       continue;
>>                 }
>>
>>                 if (test_and_clear_bit(NFS4CLNT_MOVED, &clp->cl_state)) {
>> --
>> 1.8.5.2 (Apple Git-48)
>>
>
> I think you misunderstood me. I was proposing that we move the entire
> code section that currently reads
>
>                 if (test_and_clear_bit(NFS4CLNT_MOVED, &clp->cl_state)) {
>                         section = "migration";
>                         status = nfs4_handle_migration(clp);
>                         if (status < 0)
>                                 goto out_error;
>                 }
>
> so that it occurs before the section
>
>                 if (test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
>                         section = "check lease";
>                         status = nfs4_check_lease(clp);
>                         if (status < 0)
>                                 goto out_error;
> +                      continue;
>                 }
>
> That way we only need to test once for NFS4CLNT_MOVED.
>
> Cheers
>   Trond
> --
> Trond Myklebust
>
> Linux NFS client maintainer, PrimaryData
>
> trond.myklebust@primarydata.com
> --
> 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
Olga Kornievskaia Sept. 24, 2014, 6:29 p.m. UTC | #3
Before I go ahead with the change, does it make sense to move "both"
of the migration sections NFS4CLNT_MOVED and NFS4CLNT_LEASE_MOVED
before the check lease section?

On Wed, Sep 24, 2014 at 2:05 PM, Trond Myklebust
<trond.myklebust@primarydata.com> wrote:
> Hi Olga,
>
> On Wed, Sep 24, 2014 at 12:08 PM, Olga Kornievskaia <kolga@netapp.com> wrote:
>> Commit c9fdeb28 removed a 'continue' after checking if the lease needs
>> to be renewed. However, if client hasn't moved, the code falls down to
>> starting reboot recovery erroneously (ie., sends open reclaim and gets
>> back stale_clientid error) before recovering from getting stale_clientid
>> on the renew operation.
>>
>> Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
>> ---
>>  fs/nfs/nfs4state.c | 4 +++-
>>  1 file changed, 3 insertions(+), 1 deletion(-)
>>
>> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
>> index 22fe351..4616598 100644
>> --- a/fs/nfs/nfs4state.c
>> +++ b/fs/nfs/nfs4state.c
>> @@ -2340,11 +2340,13 @@ static void nfs4_state_manager(struct nfs_client *clp)
>>                         continue;
>>                 }
>>
>> -               if (test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
>> +               if (!test_bit(NFS4CLNT_MOVED, &clp->cl_state) &&
>> +                    test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
>>                         section = "check lease";
>>                         status = nfs4_check_lease(clp);
>>                         if (status < 0)
>>                                 goto out_error;
>> +                       continue;
>>                 }
>>
>>                 if (test_and_clear_bit(NFS4CLNT_MOVED, &clp->cl_state)) {
>> --
>> 1.8.5.2 (Apple Git-48)
>>
>
> I think you misunderstood me. I was proposing that we move the entire
> code section that currently reads
>
>                 if (test_and_clear_bit(NFS4CLNT_MOVED, &clp->cl_state)) {
>                         section = "migration";
>                         status = nfs4_handle_migration(clp);
>                         if (status < 0)
>                                 goto out_error;
>                 }
>
> so that it occurs before the section
>
>                 if (test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
>                         section = "check lease";
>                         status = nfs4_check_lease(clp);
>                         if (status < 0)
>                                 goto out_error;
> +                      continue;
>                 }
>
> That way we only need to test once for NFS4CLNT_MOVED.
>
> Cheers
>   Trond
> --
> Trond Myklebust
>
> Linux NFS client maintainer, PrimaryData
>
> trond.myklebust@primarydata.com
> --
> 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
Trond Myklebust Sept. 24, 2014, 8:11 p.m. UTC | #4
On Wed, Sep 24, 2014 at 2:29 PM, Olga Kornievskaia <aglo@umich.edu> wrote:
> Before I go ahead with the change, does it make sense to move "both"
> of the migration sections NFS4CLNT_MOVED and NFS4CLNT_LEASE_MOVED
> before the check lease section?

Actually. Never mind. Thinking about this, and looking at the code, we
definitely do want to ensure that lease recovery is performed before
migration recovery.
Let's just put the 'continue;' back into the CHECK_LEASE section for
now so that we enforce that.

> On Wed, Sep 24, 2014 at 2:05 PM, Trond Myklebust
> <trond.myklebust@primarydata.com> wrote:
>> Hi Olga,
>>
>> On Wed, Sep 24, 2014 at 12:08 PM, Olga Kornievskaia <kolga@netapp.com> wrote:
>>> Commit c9fdeb28 removed a 'continue' after checking if the lease needs
>>> to be renewed. However, if client hasn't moved, the code falls down to
>>> starting reboot recovery erroneously (ie., sends open reclaim and gets
>>> back stale_clientid error) before recovering from getting stale_clientid
>>> on the renew operation.
>>>
>>> Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
>>> ---
>>>  fs/nfs/nfs4state.c | 4 +++-
>>>  1 file changed, 3 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
>>> index 22fe351..4616598 100644
>>> --- a/fs/nfs/nfs4state.c
>>> +++ b/fs/nfs/nfs4state.c
>>> @@ -2340,11 +2340,13 @@ static void nfs4_state_manager(struct nfs_client *clp)
>>>                         continue;
>>>                 }
>>>
>>> -               if (test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
>>> +               if (!test_bit(NFS4CLNT_MOVED, &clp->cl_state) &&
>>> +                    test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
>>>                         section = "check lease";
>>>                         status = nfs4_check_lease(clp);
>>>                         if (status < 0)
>>>                                 goto out_error;
>>> +                       continue;
>>>                 }
>>>
>>>                 if (test_and_clear_bit(NFS4CLNT_MOVED, &clp->cl_state)) {
>>> --
>>> 1.8.5.2 (Apple Git-48)
>>>
>>
>> I think you misunderstood me. I was proposing that we move the entire
>> code section that currently reads
>>
>>                 if (test_and_clear_bit(NFS4CLNT_MOVED, &clp->cl_state)) {
>>                         section = "migration";
>>                         status = nfs4_handle_migration(clp);
>>                         if (status < 0)
>>                                 goto out_error;
>>                 }
>>
>> so that it occurs before the section
>>
>>                 if (test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
>>                         section = "check lease";
>>                         status = nfs4_check_lease(clp);
>>                         if (status < 0)
>>                                 goto out_error;
>> +                      continue;
>>                 }
>>
>> That way we only need to test once for NFS4CLNT_MOVED.
>>
>> Cheers
>>   Trond
>> --
>> Trond Myklebust
>>
>> Linux NFS client maintainer, PrimaryData
>>
>> trond.myklebust@primarydata.com
>> --
>> 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
Olga Kornievskaia Sept. 24, 2014, 10:12 p.m. UTC | #5
On Wed, Sep 24, 2014 at 4:11 PM, Trond Myklebust
<trond.myklebust@primarydata.com> wrote:
> On Wed, Sep 24, 2014 at 2:29 PM, Olga Kornievskaia <aglo@umich.edu> wrote:
>> Before I go ahead with the change, does it make sense to move "both"
>> of the migration sections NFS4CLNT_MOVED and NFS4CLNT_LEASE_MOVED
>> before the check lease section?
>
> Actually. Never mind. Thinking about this, and looking at the code, we
> definitely do want to ensure that lease recovery is performed before
> migration recovery.
> Let's just put the 'continue;' back into the CHECK_LEASE section for
> now so that we enforce that.
>

Ok. Another one submitted.

>> On Wed, Sep 24, 2014 at 2:05 PM, Trond Myklebust
>> <trond.myklebust@primarydata.com> wrote:
>>> Hi Olga,
>>>
>>> On Wed, Sep 24, 2014 at 12:08 PM, Olga Kornievskaia <kolga@netapp.com> wrote:
>>>> Commit c9fdeb28 removed a 'continue' after checking if the lease needs
>>>> to be renewed. However, if client hasn't moved, the code falls down to
>>>> starting reboot recovery erroneously (ie., sends open reclaim and gets
>>>> back stale_clientid error) before recovering from getting stale_clientid
>>>> on the renew operation.
>>>>
>>>> Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
>>>> ---
>>>>  fs/nfs/nfs4state.c | 4 +++-
>>>>  1 file changed, 3 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
>>>> index 22fe351..4616598 100644
>>>> --- a/fs/nfs/nfs4state.c
>>>> +++ b/fs/nfs/nfs4state.c
>>>> @@ -2340,11 +2340,13 @@ static void nfs4_state_manager(struct nfs_client *clp)
>>>>                         continue;
>>>>                 }
>>>>
>>>> -               if (test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
>>>> +               if (!test_bit(NFS4CLNT_MOVED, &clp->cl_state) &&
>>>> +                    test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
>>>>                         section = "check lease";
>>>>                         status = nfs4_check_lease(clp);
>>>>                         if (status < 0)
>>>>                                 goto out_error;
>>>> +                       continue;
>>>>                 }
>>>>
>>>>                 if (test_and_clear_bit(NFS4CLNT_MOVED, &clp->cl_state)) {
>>>> --
>>>> 1.8.5.2 (Apple Git-48)
>>>>
>>>
>>> I think you misunderstood me. I was proposing that we move the entire
>>> code section that currently reads
>>>
>>>                 if (test_and_clear_bit(NFS4CLNT_MOVED, &clp->cl_state)) {
>>>                         section = "migration";
>>>                         status = nfs4_handle_migration(clp);
>>>                         if (status < 0)
>>>                                 goto out_error;
>>>                 }
>>>
>>> so that it occurs before the section
>>>
>>>                 if (test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
>>>                         section = "check lease";
>>>                         status = nfs4_check_lease(clp);
>>>                         if (status < 0)
>>>                                 goto out_error;
>>> +                      continue;
>>>                 }
>>>
>>> That way we only need to test once for NFS4CLNT_MOVED.
>>>
>>> Cheers
>>>   Trond
>>> --
>>> Trond Myklebust
>>>
>>> Linux NFS client maintainer, PrimaryData
>>>
>>> trond.myklebust@primarydata.com
>>> --
>>> 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
>
>
>
> --
> Trond Myklebust
>
> Linux NFS client maintainer, PrimaryData
>
> trond.myklebust@primarydata.com
--
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
diff mbox

Patch

diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index 22fe351..4616598 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -2340,11 +2340,13 @@  static void nfs4_state_manager(struct nfs_client *clp)
 			continue;
 		}
 
-		if (test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
+		if (!test_bit(NFS4CLNT_MOVED, &clp->cl_state) &&
+		     test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
 			section = "check lease";
 			status = nfs4_check_lease(clp);
 			if (status < 0)
 				goto out_error;
+			continue;
 		}
 
 		if (test_and_clear_bit(NFS4CLNT_MOVED, &clp->cl_state)) {