|
@@ -1138,16 +1138,14 @@ static void nfs4_reclaim_complete(struct nfs_client *clp,
|
|
|
(void)ops->reclaim_complete(clp);
|
|
|
}
|
|
|
|
|
|
-static void nfs4_state_end_reclaim_reboot(struct nfs_client *clp)
|
|
|
+static int nfs4_state_clear_reclaim_reboot(struct nfs_client *clp)
|
|
|
{
|
|
|
struct nfs4_state_owner *sp;
|
|
|
struct rb_node *pos;
|
|
|
struct nfs4_state *state;
|
|
|
|
|
|
if (!test_and_clear_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state))
|
|
|
- return;
|
|
|
-
|
|
|
- nfs4_reclaim_complete(clp, clp->cl_mvops->reboot_recovery_ops);
|
|
|
+ return 0;
|
|
|
|
|
|
for (pos = rb_first(&clp->cl_state_owners); pos != NULL; pos = rb_next(pos)) {
|
|
|
sp = rb_entry(pos, struct nfs4_state_owner, so_client_node);
|
|
@@ -1161,6 +1159,14 @@ static void nfs4_state_end_reclaim_reboot(struct nfs_client *clp)
|
|
|
}
|
|
|
|
|
|
nfs_delegation_reap_unclaimed(clp);
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+static void nfs4_state_end_reclaim_reboot(struct nfs_client *clp)
|
|
|
+{
|
|
|
+ if (!nfs4_state_clear_reclaim_reboot(clp))
|
|
|
+ return;
|
|
|
+ nfs4_reclaim_complete(clp, clp->cl_mvops->reboot_recovery_ops);
|
|
|
}
|
|
|
|
|
|
static void nfs_delegation_clear_all(struct nfs_client *clp)
|
|
@@ -1187,7 +1193,7 @@ static int nfs4_recovery_handle_error(struct nfs_client *clp, int error)
|
|
|
case -NFS4ERR_STALE_CLIENTID:
|
|
|
case -NFS4ERR_LEASE_MOVED:
|
|
|
set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
|
|
|
- nfs4_state_end_reclaim_reboot(clp);
|
|
|
+ nfs4_state_clear_reclaim_reboot(clp);
|
|
|
nfs4_state_start_reclaim_reboot(clp);
|
|
|
break;
|
|
|
case -NFS4ERR_EXPIRED:
|