Skip to content
Snippets Groups Projects
nfs4state.c 26.7 KiB
Newer Older
			case -NFS4ERR_LEASE_MOVED:
				ops = &nfs4_reboot_recovery_ops;
		}

		/* We're going to have to re-establish a clientid */
		nfs4_state_mark_reclaim(clp);

		status = nfs4_reclaim_lease(clp);
		if (status) {
			if (status == -EAGAIN)
				continue;
			goto out_error;
		}

		/* Mark all delegations for reclaim */
		nfs_delegation_mark_reclaim(clp);
		/* Note: list is protected by exclusive lock on cl->cl_sem */
		status = nfs4_do_reclaim(clp, ops);
Linus Torvalds's avatar
Linus Torvalds committed
		if (status < 0) {
			if (status == -NFS4ERR_NO_GRACE) {
				ops = &nfs4_network_partition_recovery_ops;
				status = nfs4_do_reclaim(clp, ops);
Linus Torvalds's avatar
Linus Torvalds committed
			}
			if (status == -NFS4ERR_STALE_CLIENTID)
Linus Torvalds's avatar
Linus Torvalds committed
			if (status == -NFS4ERR_EXPIRED)
Linus Torvalds's avatar
Linus Torvalds committed
		}
		nfs_delegation_reap_unclaimed(clp);
		break;
Linus Torvalds's avatar
Linus Torvalds committed
	}
out:
	up_write(&clp->cl_sem);
	if (status == -NFS4ERR_CB_PATH_DOWN)
		nfs_handle_cb_pathdown(clp);
	nfs4_clear_recover_bit(clp);
	nfs_put_client(clp);
Linus Torvalds's avatar
Linus Torvalds committed
	return 0;
out_error:
	printk(KERN_WARNING "Error: state recovery failed on NFSv4 server %s"
			" with error %d\n", clp->cl_hostname, -status);
	set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
Linus Torvalds's avatar
Linus Torvalds committed
	goto out;
}

/*
 * Local variables:
 *  c-basic-offset: 8
 * End:
 */