|
@@ -1615,7 +1615,7 @@ void nfs41_handle_recall_slot(struct nfs_client *clp)
|
|
|
static void nfs4_reset_all_state(struct nfs_client *clp)
|
|
|
{
|
|
|
if (test_and_set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) == 0) {
|
|
|
- clp->cl_boot_time = CURRENT_TIME;
|
|
|
+ set_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state);
|
|
|
nfs4_state_start_reclaim_nograce(clp);
|
|
|
nfs4_schedule_state_manager(clp);
|
|
|
}
|
|
@@ -1631,7 +1631,6 @@ static void nfs41_handle_server_reboot(struct nfs_client *clp)
|
|
|
|
|
|
static void nfs41_handle_state_revoked(struct nfs_client *clp)
|
|
|
{
|
|
|
- /* Temporary */
|
|
|
nfs4_reset_all_state(clp);
|
|
|
}
|
|
|
|
|
@@ -1652,6 +1651,10 @@ void nfs41_handle_sequence_flag_errors(struct nfs_client *clp, u32 flags)
|
|
|
{
|
|
|
if (!flags)
|
|
|
return;
|
|
|
+
|
|
|
+ dprintk("%s: \"%s\" (client ID %llx) flags=0x%08x\n",
|
|
|
+ __func__, clp->cl_hostname, clp->cl_clientid, flags);
|
|
|
+
|
|
|
if (flags & SEQ4_STATUS_RESTART_RECLAIM_NEEDED)
|
|
|
nfs41_handle_server_reboot(clp);
|
|
|
if (flags & (SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED |
|
|
@@ -1762,6 +1765,12 @@ static void nfs4_state_manager(struct nfs_client *clp)
|
|
|
|
|
|
/* Ensure exclusive access to NFSv4 state */
|
|
|
do {
|
|
|
+ if (test_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state)) {
|
|
|
+ nfs4_reclaim_lease(clp);
|
|
|
+ clear_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state);
|
|
|
+ set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
|
|
|
+ }
|
|
|
+
|
|
|
if (test_and_clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) {
|
|
|
/* We're going to have to re-establish a clientid */
|
|
|
status = nfs4_reclaim_lease(clp);
|