| From f02f3755dbd14fb935d24b14650fff9ba92243b8 Mon Sep 17 00:00:00 2001 |
| From: ZhangXiaoxu <zhangxiaoxu5@huawei.com> |
| Date: Mon, 6 May 2019 11:57:03 +0800 |
| Subject: NFS4: Fix v4.0 client state corruption when mount |
| |
| From: ZhangXiaoxu <zhangxiaoxu5@huawei.com> |
| |
| commit f02f3755dbd14fb935d24b14650fff9ba92243b8 upstream. |
| |
| stat command with soft mount never return after server is stopped. |
| |
| When alloc a new client, the state of the client will be set to |
| NFS4CLNT_LEASE_EXPIRED. |
| |
| When the server is stopped, the state manager will work, and accord |
| the state to recover. But the state is NFS4CLNT_LEASE_EXPIRED, it |
| will drain the slot table and lead other task to wait queue, until |
| the client recovered. Then the stat command is hung. |
| |
| When discover server trunking, the client will renew the lease, |
| but check the client state, it lead the client state corruption. |
| |
| So, we need to call state manager to recover it when detect server |
| ip trunking. |
| |
| Signed-off-by: ZhangXiaoxu <zhangxiaoxu5@huawei.com> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/nfs/nfs4state.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/fs/nfs/nfs4state.c |
| +++ b/fs/nfs/nfs4state.c |
| @@ -143,6 +143,10 @@ int nfs40_discover_server_trunking(struc |
| /* Sustain the lease, even if it's empty. If the clientid4 |
| * goes stale it's of no use for trunking discovery. */ |
| nfs4_schedule_state_renewal(*result); |
| + |
| + /* If the client state need to recover, do it. */ |
| + if (clp->cl_state) |
| + nfs4_schedule_state_manager(clp); |
| } |
| out: |
| return status; |