* [PATCH] NFSv4: Fix state recovery deadlock when server misses grace period
@ 2026-04-22 6:44 Zhihao Cheng
2026-04-22 6:55 ` Zhihao Cheng
0 siblings, 1 reply; 4+ messages in thread
From: Zhihao Cheng @ 2026-04-22 6:44 UTC (permalink / raw)
To: trondmy, anna; +Cc: linux-nfs, linux-kernel, chengzhihao1, yangerkun
NFS server restart causes client to enter an infinite loop during state
recovery. The state manager gets stuck in NFS4CLNT_RECLAIM_NOGRACE processing,
with the server repeatedly returning NFS4ERR_GRACE for each file iteration.
This problem is reported in [1].
Trigger sequence:
1. Client opens 2 files. After server reboot, client enters
nfs4_do_reclaim(RECLAIM_REBOOT). Server misses grace period and returns
NFS4ERR_NO_GRACE, causing client to set NFS4CLNT_RECLAIM_NOGRACE.
2. Client enters nfs4_do_reclaim(RECLAIM_NOGRACE) to recover first file.
Server reboots again, open request returns NFS4ERR_BADSESSION, client
sets NFS4CLNT_SESSION_RESET.
3. nfs4_reset_session calls nfs4_proc_create_session which fails with
ETIMEDOUT due to network¹ÊÕÏ, nfs4_handle_reclaim_lease_error sets
NFS4CLNT_LEASE_EXPIRED but does NOT set NFS4CLNT_RECLAIM_REBOOT.
4. When nfs4_reclaim_lease runs, because NFS4CLNT_RECLAIM_NOGRACE is already
set, it skips setting NFS4CLNT_RECLAIM_REBOOT (the bug, modified by
commit b42353ff8d346 ("NFSv4.1: Clean up nfs4_reclaim_lease")).
5. Server never receives RECLAIM_COMPLETE, so cl_flags lacks
NFSD4_CLIENT_RECLAIM_COMPLETE. When processing subsequent files,
server always returns nfserr_grace, causing infinite retry loop.
Fix it by setting NFS4CLNT_RECLAIM_REBOOT in nfs4_reclaim_lease if
NFS4CLNT_SERVER_SCOPE_MISMATCH is not set, so that the client sends
RECLAIM_COMPLETE to the server first, allowing subsequent nograce
recovery to proceed.
Fetch a reproducer in [2].
[1] https://lore.kernel.org/linux-nfs/55da00d4-a656-4ed2-ae57-7f881297a1b2@huawei.com/
[2] https://bugzilla.kernel.org/show_bug.cgi?id=221399
Fixes: b42353ff8d346 ("NFSv4.1: Clean up nfs4_reclaim_lease")
Cc: stable@vger.kernel.org
Reported-by: Li Lingfeng <lilingfeng3@huawei.com>
Closes: https://lore.kernel.org/linux-nfs/55da00d4-a656-4ed2-ae57-7f881297a1b2@huawei.com/
Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
---
fs/nfs/nfs4state.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index 305a772e5497..817327e73d88 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -2012,7 +2012,7 @@ static int nfs4_reclaim_lease(struct nfs_client *clp)
return nfs4_handle_reclaim_lease_error(clp, status);
if (test_and_clear_bit(NFS4CLNT_SERVER_SCOPE_MISMATCH, &clp->cl_state))
nfs4_state_start_reclaim_nograce(clp);
- if (!test_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state))
+ else
set_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state);
clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state);
clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
--
2.52.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] NFSv4: Fix state recovery deadlock when server misses grace period
2026-04-22 6:44 [PATCH] NFSv4: Fix state recovery deadlock when server misses grace period Zhihao Cheng
@ 2026-04-22 6:55 ` Zhihao Cheng
2026-04-22 12:38 ` Trond Myklebust
0 siblings, 1 reply; 4+ messages in thread
From: Zhihao Cheng @ 2026-04-22 6:55 UTC (permalink / raw)
To: trondmy, anna; +Cc: linux-nfs, linux-kernel, yangerkun, Li Lingfeng
在 2026/4/22 14:44, Zhihao Cheng 写道:
Add lilingfeng3@huawei.com
> NFS server restart causes client to enter an infinite loop during state
> recovery. The state manager gets stuck in NFS4CLNT_RECLAIM_NOGRACE processing,
> with the server repeatedly returning NFS4ERR_GRACE for each file iteration.
> This problem is reported in [1].
>
> Trigger sequence:
> 1. Client opens 2 files. After server reboot, client enters
> nfs4_do_reclaim(RECLAIM_REBOOT). Server misses grace period and returns
> NFS4ERR_NO_GRACE, causing client to set NFS4CLNT_RECLAIM_NOGRACE.
> 2. Client enters nfs4_do_reclaim(RECLAIM_NOGRACE) to recover first file.
> Server reboots again, open request returns NFS4ERR_BADSESSION, client
> sets NFS4CLNT_SESSION_RESET.
> 3. nfs4_reset_session calls nfs4_proc_create_session which fails with
> ETIMEDOUT due to network¹ÊÕÏ, nfs4_handle_reclaim_lease_error sets
> NFS4CLNT_LEASE_EXPIRED but does NOT set NFS4CLNT_RECLAIM_REBOOT.
> 4. When nfs4_reclaim_lease runs, because NFS4CLNT_RECLAIM_NOGRACE is already
> set, it skips setting NFS4CLNT_RECLAIM_REBOOT (the bug, modified by
> commit b42353ff8d346 ("NFSv4.1: Clean up nfs4_reclaim_lease")).
> 5. Server never receives RECLAIM_COMPLETE, so cl_flags lacks
> NFSD4_CLIENT_RECLAIM_COMPLETE. When processing subsequent files,
> server always returns nfserr_grace, causing infinite retry loop.
>
> Fix it by setting NFS4CLNT_RECLAIM_REBOOT in nfs4_reclaim_lease if
> NFS4CLNT_SERVER_SCOPE_MISMATCH is not set, so that the client sends
> RECLAIM_COMPLETE to the server first, allowing subsequent nograce
> recovery to proceed.
>
> Fetch a reproducer in [2].
>
> [1] https://lore.kernel.org/linux-nfs/55da00d4-a656-4ed2-ae57-7f881297a1b2@huawei.com/
> [2] https://bugzilla.kernel.org/show_bug.cgi?id=221399
>
> Fixes: b42353ff8d346 ("NFSv4.1: Clean up nfs4_reclaim_lease")
> Cc: stable@vger.kernel.org
> Reported-by: Li Lingfeng <lilingfeng3@huawei.com>
> Closes: https://lore.kernel.org/linux-nfs/55da00d4-a656-4ed2-ae57-7f881297a1b2@huawei.com/
> Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
> ---
> fs/nfs/nfs4state.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
> index 305a772e5497..817327e73d88 100644
> --- a/fs/nfs/nfs4state.c
> +++ b/fs/nfs/nfs4state.c
> @@ -2012,7 +2012,7 @@ static int nfs4_reclaim_lease(struct nfs_client *clp)
> return nfs4_handle_reclaim_lease_error(clp, status);
> if (test_and_clear_bit(NFS4CLNT_SERVER_SCOPE_MISMATCH, &clp->cl_state))
> nfs4_state_start_reclaim_nograce(clp);
> - if (!test_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state))
> + else
> set_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state);
> clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state);
> clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] NFSv4: Fix state recovery deadlock when server misses grace period
2026-04-22 6:55 ` Zhihao Cheng
@ 2026-04-22 12:38 ` Trond Myklebust
2026-04-23 9:05 ` Zhihao Cheng
0 siblings, 1 reply; 4+ messages in thread
From: Trond Myklebust @ 2026-04-22 12:38 UTC (permalink / raw)
To: Zhihao Cheng, anna; +Cc: linux-nfs, linux-kernel, yangerkun, Li Lingfeng
On Wed, 2026-04-22 at 14:55 +0800, Zhihao Cheng wrote:
> 在 2026/4/22 14:44, Zhihao Cheng 写道:
> Add lilingfeng3@huawei.com
> > NFS server restart causes client to enter an infinite loop during
> > state
> > recovery. The state manager gets stuck in NFS4CLNT_RECLAIM_NOGRACE
> > processing,
> > with the server repeatedly returning NFS4ERR_GRACE for each file
> > iteration.
> > This problem is reported in [1].
> >
> > Trigger sequence:
> > 1. Client opens 2 files. After server reboot, client enters
> > nfs4_do_reclaim(RECLAIM_REBOOT). Server misses grace period
> > and returns
> > NFS4ERR_NO_GRACE, causing client to set
> > NFS4CLNT_RECLAIM_NOGRACE.
> > 2. Client enters nfs4_do_reclaim(RECLAIM_NOGRACE) to recover
> > first file.
> > Server reboots again, open request returns NFS4ERR_BADSESSION,
> > client
> > sets NFS4CLNT_SESSION_RESET.
> > 3. nfs4_reset_session calls nfs4_proc_create_session which fails
> > with
> > ETIMEDOUT due to network¹ÊÕÏ, nfs4_handle_reclaim_lease_error
> > sets
> > NFS4CLNT_LEASE_EXPIRED but does NOT set
> > NFS4CLNT_RECLAIM_REBOOT.
> > 4. When nfs4_reclaim_lease runs, because NFS4CLNT_RECLAIM_NOGRACE
> > is already
> > set, it skips setting NFS4CLNT_RECLAIM_REBOOT (the bug,
> > modified by
> > commit b42353ff8d346 ("NFSv4.1: Clean up
> > nfs4_reclaim_lease")).
> > 5. Server never receives RECLAIM_COMPLETE, so cl_flags lacks
> > NFSD4_CLIENT_RECLAIM_COMPLETE. When processing subsequent
> > files,
> > server always returns nfserr_grace, causing infinite retry
> > loop.
> >
> > Fix it by setting NFS4CLNT_RECLAIM_REBOOT in nfs4_reclaim_lease if
> > NFS4CLNT_SERVER_SCOPE_MISMATCH is not set, so that the client sends
> > RECLAIM_COMPLETE to the server first, allowing subsequent nograce
> > recovery to proceed.
> >
> > Fetch a reproducer in [2].
> >
> > [1]
> > https://lore.kernel.org/linux-nfs/55da00d4-a656-4ed2-ae57-7f881297a1b2@huawei.com/
> > [2] https://bugzilla.kernel.org/show_bug.cgi?id=221399
> >
> > Fixes: b42353ff8d346 ("NFSv4.1: Clean up nfs4_reclaim_lease")
> > Cc: stable@vger.kernel.org
> > Reported-by: Li Lingfeng <lilingfeng3@huawei.com>
> > Closes:
> > https://lore.kernel.org/linux-nfs/55da00d4-a656-4ed2-ae57-7f881297a1b2@huawei.com/
> > Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
> > ---
> > fs/nfs/nfs4state.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
> > index 305a772e5497..817327e73d88 100644
> > --- a/fs/nfs/nfs4state.c
> > +++ b/fs/nfs/nfs4state.c
> > @@ -2012,7 +2012,7 @@ static int nfs4_reclaim_lease(struct
> > nfs_client *clp)
> > return nfs4_handle_reclaim_lease_error(clp,
> > status);
> > if (test_and_clear_bit(NFS4CLNT_SERVER_SCOPE_MISMATCH,
> > &clp->cl_state))
> > nfs4_state_start_reclaim_nograce(clp);
> > - if (!test_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state))
> > + else
> > set_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state);
> > clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state);
> > clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
> >
>
This will cause the client to try to do reboot recovery in a situation
where it isn't allowed to do so by the spec. We should never be setting
NFS4CLNT_RECLAIM_REBOOT if NFS4CLNT_RECLAIM_NOGRACE is already set.
One solution would be to just immediately call
nfs4_state_end_reclaim_reboot() if NFS4CLNT_RECLAIM_NOGRACE is set.
--
Trond Myklebust
Linux NFS client maintainer, Hammerspace
trondmy@kernel.org, trond.myklebust@hammerspace.com
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] NFSv4: Fix state recovery deadlock when server misses grace period
2026-04-22 12:38 ` Trond Myklebust
@ 2026-04-23 9:05 ` Zhihao Cheng
0 siblings, 0 replies; 4+ messages in thread
From: Zhihao Cheng @ 2026-04-23 9:05 UTC (permalink / raw)
To: Trond Myklebust, anna; +Cc: linux-nfs, linux-kernel, yangerkun, Li Lingfeng
在 2026/4/22 20:38, Trond Myklebust 写道:
> On Wed, 2026-04-22 at 14:55 +0800, Zhihao Cheng wrote:
>> 在 2026/4/22 14:44, Zhihao Cheng 写道:
>> Add lilingfeng3@huawei.com
>>> NFS server restart causes client to enter an infinite loop during
>>> state
>>> recovery. The state manager gets stuck in NFS4CLNT_RECLAIM_NOGRACE
>>> processing,
>>> with the server repeatedly returning NFS4ERR_GRACE for each file
>>> iteration.
>>> This problem is reported in [1].
>>>
>>> Trigger sequence:
>>> 1. Client opens 2 files. After server reboot, client enters
>>> nfs4_do_reclaim(RECLAIM_REBOOT). Server misses grace period
>>> and returns
>>> NFS4ERR_NO_GRACE, causing client to set
>>> NFS4CLNT_RECLAIM_NOGRACE.
>>> 2. Client enters nfs4_do_reclaim(RECLAIM_NOGRACE) to recover
>>> first file.
>>> Server reboots again, open request returns NFS4ERR_BADSESSION,
>>> client
>>> sets NFS4CLNT_SESSION_RESET.
>>> 3. nfs4_reset_session calls nfs4_proc_create_session which fails
>>> with
>>> ETIMEDOUT due to network¹ÊÕÏ, nfs4_handle_reclaim_lease_error
>>> sets
>>> NFS4CLNT_LEASE_EXPIRED but does NOT set
>>> NFS4CLNT_RECLAIM_REBOOT.
>>> 4. When nfs4_reclaim_lease runs, because NFS4CLNT_RECLAIM_NOGRACE
>>> is already
>>> set, it skips setting NFS4CLNT_RECLAIM_REBOOT (the bug,
>>> modified by
>>> commit b42353ff8d346 ("NFSv4.1: Clean up
>>> nfs4_reclaim_lease")).
>>> 5. Server never receives RECLAIM_COMPLETE, so cl_flags lacks
>>> NFSD4_CLIENT_RECLAIM_COMPLETE. When processing subsequent
>>> files,
>>> server always returns nfserr_grace, causing infinite retry
>>> loop.
>>>
>>> Fix it by setting NFS4CLNT_RECLAIM_REBOOT in nfs4_reclaim_lease if
>>> NFS4CLNT_SERVER_SCOPE_MISMATCH is not set, so that the client sends
>>> RECLAIM_COMPLETE to the server first, allowing subsequent nograce
>>> recovery to proceed.
>>>
>>> Fetch a reproducer in [2].
>>>
>>> [1]
>>> https://lore.kernel.org/linux-nfs/55da00d4-a656-4ed2-ae57-7f881297a1b2@huawei.com/
>>> [2] https://bugzilla.kernel.org/show_bug.cgi?id=221399
>>>
>>> Fixes: b42353ff8d346 ("NFSv4.1: Clean up nfs4_reclaim_lease")
>>> Cc: stable@vger.kernel.org
>>> Reported-by: Li Lingfeng <lilingfeng3@huawei.com>
>>> Closes:
>>> https://lore.kernel.org/linux-nfs/55da00d4-a656-4ed2-ae57-7f881297a1b2@huawei.com/
>>> Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
>>> ---
>>> fs/nfs/nfs4state.c | 2 +-
>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
>>> index 305a772e5497..817327e73d88 100644
>>> --- a/fs/nfs/nfs4state.c
>>> +++ b/fs/nfs/nfs4state.c
>>> @@ -2012,7 +2012,7 @@ static int nfs4_reclaim_lease(struct
>>> nfs_client *clp)
>>> return nfs4_handle_reclaim_lease_error(clp,
>>> status);
>>> if (test_and_clear_bit(NFS4CLNT_SERVER_SCOPE_MISMATCH,
>>> &clp->cl_state))
>>> nfs4_state_start_reclaim_nograce(clp);
>>> - if (!test_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state))
>>> + else
>>> set_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state);
>>> clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state);
>>> clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
>>>
>>
> This will cause the client to try to do reboot recovery in a situation
> where it isn't allowed to do so by the spec. We should never be setting
> NFS4CLNT_RECLAIM_REBOOT if NFS4CLNT_RECLAIM_NOGRACE is already set.
Hi Trond, the client can only do reclaim reboot during the grace
period(after server reboot), according to [1], any reclaim type messages
should be rejected by server for NOGRACE state, am I understanding right?
[1] https://datatracker.ietf.org/doc/html/rfc5661#section-8.4.2.1
>
> One solution would be to just immediately call
> nfs4_state_end_reclaim_reboot() if NFS4CLNT_RECLAIM_NOGRACE is set.
>
I tried with your suggestion, and the problem still happens:
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index 5044bb4c870f..5b6cb3f7ff2e 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -2014,6 +2014,8 @@ static int nfs4_reclaim_lease(struct nfs_client *clp)
nfs4_state_start_reclaim_nograce(clp);
if (!test_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state))
set_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state);
+ else
+ nfs4_state_end_reclaim_reboot(clp);
clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state);
clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
return 0;
The nfs4_state_end_reclaim_reboot sends RECLAIM_COMPLETE only if the clp
has NFS4CLNT_RECLAIM_REBOOT flag, but it does not.
The root cause is that the client has identified an incorrect server
status after the server's second reboot(since step 2). I think the
client should do reclaim reboot every time the server restarts, so we
should let client know the server reboots again, can we take following
methods?
1. Clear NFS4CLNT_RECLAIM_NOGRACE flag if client knows that the server
restart while doing nfs4_do_reclaim(NFS4CLNT_RECLAIM_NOGRACE). Client
could identify the server state by NFS4ERR_BADSESSION retcode:
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index 5044bb4c870f..3f73dc3919a2 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -1875,6 +1875,9 @@ static int nfs4_do_reclaim(struct nfs_client *clp,
const struct nfs4_state_recov
clp->cl_hostname, lost_locks);
set_bit(ops->owner_flag_bit, &sp->so_flags);
nfs4_put_state_owner(sp);
+ if (ops == clp->cl_mvops->nograce_recovery_ops &&
+ status == -NFS4ERR_BADSESSION)
+ clear_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state);
status = nfs4_recovery_handle_error(clp, status);
nfs4_free_state_owners(&freeme);
return (status != 0) ? status : -EAGAIN;
2. Client knows the server restarts by error code
NFS4ERR_STALE_CLIENTID(nfs4_proc_create_session ->
nfs4_handle_reclaim_lease_error), but nfs4_reset_session won't retry if
the error code is ETIMEDOUT(eg. network failure in step 3), we should
let client retry nfs4_reset_session if network failure.
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index 5044bb4c870f..62fd57e602d6 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -2459,6 +2459,8 @@ static int nfs4_reset_session(struct nfs_client *clp)
if (status) {
dprintk("%s: session reset failed with status %d for server %s!\n",
__func__, status, clp->cl_hostname);
+ if (status == -ETIMEDOUT)
+ goto out;
status = nfs4_handle_reclaim_lease_error(clp, status);
goto out;
}
@@ -2552,6 +2554,8 @@ static void nfs4_state_manager(struct nfs_client *clp)
if (test_and_clear_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state)) {
section = "reset session";
status = nfs4_reset_session(clp);
+ if (status == -ETIMEDOUT)
+ continue;
if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state))
continue;
if (status < 0)
3. Conditionaly set NFS4CLNT_RECLAIM_REBOOT in nfs4_reclaim_lease, if
the client has ever been recovered failed by
nfs4_do_reclaim(NFS4CLNT_RECLAIM_NOGRACE)->BAD_SESSION, mark clp with
NFS4CLNT_RECLAIM_REBOOT.
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index 5044bb4c870f..82eb650cc135 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -1875,6 +1875,9 @@ static int nfs4_do_reclaim(struct nfs_client *clp,
const struct nfs4_state_recov
clp->cl_hostname, lost_locks);
set_bit(ops->owner_flag_bit, &sp->so_flags);
nfs4_put_state_owner(sp);
+ if (ops == clp->cl_mvops->nograce_recovery_ops &&
+ status == -NFS4ERR_BADSESSION)
+ __set_bit(NFS_CS_NOGRACE_REBOOT, &clp->cl_flags);
status = nfs4_recovery_handle_error(clp, status);
nfs4_free_state_owners(&freeme);
return (status != 0) ? status : -EAGAIN;
@@ -2012,7 +2015,7 @@ static int nfs4_reclaim_lease(struct nfs_client *clp)
return nfs4_handle_reclaim_lease_error(clp, status);
if (test_and_clear_bit(NFS4CLNT_SERVER_SCOPE_MISMATCH, &clp->cl_state))
nfs4_state_start_reclaim_nograce(clp);
- if (!test_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state))
+ if (!test_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state) ||
test_bit(NFS_CS_NOGRACE_REBOOT, &clp->cl_flags))
set_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state);
clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state);
clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
@@ -2624,6 +2627,7 @@ static void nfs4_state_manager(struct nfs_client *clp)
continue;
if (status < 0)
goto out_error;
+ clear_bit(NFS_CS_NOGRACE_REBOOT, &clp->cl_flags);
clear_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state);
}
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h
index 4daee27fa5eb..8d36a727513c 100644
--- a/include/linux/nfs_fs_sb.h
+++ b/include/linux/nfs_fs_sb.h
@@ -51,6 +51,7 @@ struct nfs_client {
#define NFS_CS_REUSEPORT 8 /* - reuse src port on reconnect */
#define NFS_CS_PNFS 9 /* - Server used for pnfs */
#define NFS_CS_NETUNREACH_FATAL 10 /* - ENETUNREACH errors are fatal */
+#define NFS_CS_NOGRACE_REBOOT 11 /* - Server reboot during nograce
recovery */
struct sockaddr_storage cl_addr; /* server identifier */
size_t cl_addrlen;
char * cl_hostname; /* hostname of server */
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-04-23 9:05 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-22 6:44 [PATCH] NFSv4: Fix state recovery deadlock when server misses grace period Zhihao Cheng
2026-04-22 6:55 ` Zhihao Cheng
2026-04-22 12:38 ` Trond Myklebust
2026-04-23 9:05 ` Zhihao Cheng
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox