xref: /openbmc/linux/fs/nfs/nfs4state.c (revision 5b4cb650)
1 /*
2  *  fs/nfs/nfs4state.c
3  *
4  *  Client-side XDR for NFSv4.
5  *
6  *  Copyright (c) 2002 The Regents of the University of Michigan.
7  *  All rights reserved.
8  *
9  *  Kendrick Smith <kmsmith@umich.edu>
10  *
11  *  Redistribution and use in source and binary forms, with or without
12  *  modification, are permitted provided that the following conditions
13  *  are met:
14  *
15  *  1. Redistributions of source code must retain the above copyright
16  *     notice, this list of conditions and the following disclaimer.
17  *  2. Redistributions in binary form must reproduce the above copyright
18  *     notice, this list of conditions and the following disclaimer in the
19  *     documentation and/or other materials provided with the distribution.
20  *  3. Neither the name of the University nor the names of its
21  *     contributors may be used to endorse or promote products derived
22  *     from this software without specific prior written permission.
23  *
24  *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
25  *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
26  *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27  *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28  *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
31  *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
32  *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
33  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
34  *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35  *
36  * Implementation of the NFSv4 state model.  For the time being,
37  * this is minimal, but will be made much more complex in a
38  * subsequent patch.
39  */
40 
41 #include <linux/kernel.h>
42 #include <linux/slab.h>
43 #include <linux/fs.h>
44 #include <linux/nfs_fs.h>
45 #include <linux/kthread.h>
46 #include <linux/module.h>
47 #include <linux/random.h>
48 #include <linux/ratelimit.h>
49 #include <linux/workqueue.h>
50 #include <linux/bitops.h>
51 #include <linux/jiffies.h>
52 
53 #include <linux/sunrpc/clnt.h>
54 
55 #include "nfs4_fs.h"
56 #include "callback.h"
57 #include "delegation.h"
58 #include "internal.h"
59 #include "nfs4idmap.h"
60 #include "nfs4session.h"
61 #include "pnfs.h"
62 #include "netns.h"
63 
64 #define NFSDBG_FACILITY		NFSDBG_STATE
65 
66 #define OPENOWNER_POOL_SIZE	8
67 
68 const nfs4_stateid zero_stateid = {
69 	{ .data = { 0 } },
70 	.type = NFS4_SPECIAL_STATEID_TYPE,
71 };
72 const nfs4_stateid invalid_stateid = {
73 	{
74 		/* Funky initialiser keeps older gcc versions happy */
75 		.data = { 0xff, 0xff, 0xff, 0xff, 0 },
76 	},
77 	.type = NFS4_INVALID_STATEID_TYPE,
78 };
79 
80 const nfs4_stateid current_stateid = {
81 	{
82 		/* Funky initialiser keeps older gcc versions happy */
83 		.data = { 0x0, 0x0, 0x0, 0x1, 0 },
84 	},
85 	.type = NFS4_SPECIAL_STATEID_TYPE,
86 };
87 
88 static DEFINE_MUTEX(nfs_clid_init_mutex);
89 
90 int nfs4_init_clientid(struct nfs_client *clp, const struct cred *cred)
91 {
92 	struct nfs4_setclientid_res clid = {
93 		.clientid = clp->cl_clientid,
94 		.confirm = clp->cl_confirm,
95 	};
96 	unsigned short port;
97 	int status;
98 	struct nfs_net *nn = net_generic(clp->cl_net, nfs_net_id);
99 
100 	if (test_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state))
101 		goto do_confirm;
102 	port = nn->nfs_callback_tcpport;
103 	if (clp->cl_addr.ss_family == AF_INET6)
104 		port = nn->nfs_callback_tcpport6;
105 
106 	status = nfs4_proc_setclientid(clp, NFS4_CALLBACK, port, cred, &clid);
107 	if (status != 0)
108 		goto out;
109 	clp->cl_clientid = clid.clientid;
110 	clp->cl_confirm = clid.confirm;
111 	set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
112 do_confirm:
113 	status = nfs4_proc_setclientid_confirm(clp, &clid, cred);
114 	if (status != 0)
115 		goto out;
116 	clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
117 	nfs4_schedule_state_renewal(clp);
118 out:
119 	return status;
120 }
121 
122 /**
123  * nfs40_discover_server_trunking - Detect server IP address trunking (mv0)
124  *
125  * @clp: nfs_client under test
126  * @result: OUT: found nfs_client, or clp
127  * @cred: credential to use for trunking test
128  *
129  * Returns zero, a negative errno, or a negative NFS4ERR status.
130  * If zero is returned, an nfs_client pointer is planted in
131  * "result".
132  *
133  * Note: The returned client may not yet be marked ready.
134  */
135 int nfs40_discover_server_trunking(struct nfs_client *clp,
136 				   struct nfs_client **result,
137 				   const struct cred *cred)
138 {
139 	struct nfs4_setclientid_res clid = {
140 		.clientid = clp->cl_clientid,
141 		.confirm = clp->cl_confirm,
142 	};
143 	struct nfs_net *nn = net_generic(clp->cl_net, nfs_net_id);
144 	unsigned short port;
145 	int status;
146 
147 	port = nn->nfs_callback_tcpport;
148 	if (clp->cl_addr.ss_family == AF_INET6)
149 		port = nn->nfs_callback_tcpport6;
150 
151 	status = nfs4_proc_setclientid(clp, NFS4_CALLBACK, port, cred, &clid);
152 	if (status != 0)
153 		goto out;
154 	clp->cl_clientid = clid.clientid;
155 	clp->cl_confirm = clid.confirm;
156 
157 	status = nfs40_walk_client_list(clp, result, cred);
158 	if (status == 0) {
159 		/* Sustain the lease, even if it's empty.  If the clientid4
160 		 * goes stale it's of no use for trunking discovery. */
161 		nfs4_schedule_state_renewal(*result);
162 	}
163 out:
164 	return status;
165 }
166 
167 const struct cred *nfs4_get_machine_cred(struct nfs_client *clp)
168 {
169 	return get_cred(rpc_machine_cred());
170 }
171 
172 static void nfs4_root_machine_cred(struct nfs_client *clp)
173 {
174 
175 	/* Force root creds instead of machine */
176 	clp->cl_principal = NULL;
177 	clp->cl_rpcclient->cl_principal = NULL;
178 }
179 
180 static const struct cred *
181 nfs4_get_renew_cred_server_locked(struct nfs_server *server)
182 {
183 	const struct cred *cred = NULL;
184 	struct nfs4_state_owner *sp;
185 	struct rb_node *pos;
186 
187 	for (pos = rb_first(&server->state_owners);
188 	     pos != NULL;
189 	     pos = rb_next(pos)) {
190 		sp = rb_entry(pos, struct nfs4_state_owner, so_server_node);
191 		if (list_empty(&sp->so_states))
192 			continue;
193 		cred = get_cred(sp->so_cred);
194 		break;
195 	}
196 	return cred;
197 }
198 
199 /**
200  * nfs4_get_renew_cred - Acquire credential for a renew operation
201  * @clp: client state handle
202  *
203  * Returns an rpc_cred with reference count bumped, or NULL.
204  * Caller must hold clp->cl_lock.
205  */
206 const struct cred *nfs4_get_renew_cred(struct nfs_client *clp)
207 {
208 	const struct cred *cred = NULL;
209 	struct nfs_server *server;
210 
211 	/* Use machine credentials if available */
212 	cred = nfs4_get_machine_cred(clp);
213 	if (cred != NULL)
214 		goto out;
215 
216 	spin_lock(&clp->cl_lock);
217 	rcu_read_lock();
218 	list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
219 		cred = nfs4_get_renew_cred_server_locked(server);
220 		if (cred != NULL)
221 			break;
222 	}
223 	rcu_read_unlock();
224 	spin_unlock(&clp->cl_lock);
225 
226 out:
227 	return cred;
228 }
229 
230 static void nfs4_end_drain_slot_table(struct nfs4_slot_table *tbl)
231 {
232 	if (test_and_clear_bit(NFS4_SLOT_TBL_DRAINING, &tbl->slot_tbl_state)) {
233 		spin_lock(&tbl->slot_tbl_lock);
234 		nfs41_wake_slot_table(tbl);
235 		spin_unlock(&tbl->slot_tbl_lock);
236 	}
237 }
238 
239 static void nfs4_end_drain_session(struct nfs_client *clp)
240 {
241 	struct nfs4_session *ses = clp->cl_session;
242 
243 	if (clp->cl_slot_tbl) {
244 		nfs4_end_drain_slot_table(clp->cl_slot_tbl);
245 		return;
246 	}
247 
248 	if (ses != NULL) {
249 		nfs4_end_drain_slot_table(&ses->bc_slot_table);
250 		nfs4_end_drain_slot_table(&ses->fc_slot_table);
251 	}
252 }
253 
254 static int nfs4_drain_slot_tbl(struct nfs4_slot_table *tbl)
255 {
256 	set_bit(NFS4_SLOT_TBL_DRAINING, &tbl->slot_tbl_state);
257 	spin_lock(&tbl->slot_tbl_lock);
258 	if (tbl->highest_used_slotid != NFS4_NO_SLOT) {
259 		reinit_completion(&tbl->complete);
260 		spin_unlock(&tbl->slot_tbl_lock);
261 		return wait_for_completion_interruptible(&tbl->complete);
262 	}
263 	spin_unlock(&tbl->slot_tbl_lock);
264 	return 0;
265 }
266 
267 static int nfs4_begin_drain_session(struct nfs_client *clp)
268 {
269 	struct nfs4_session *ses = clp->cl_session;
270 	int ret;
271 
272 	if (clp->cl_slot_tbl)
273 		return nfs4_drain_slot_tbl(clp->cl_slot_tbl);
274 
275 	/* back channel */
276 	ret = nfs4_drain_slot_tbl(&ses->bc_slot_table);
277 	if (ret)
278 		return ret;
279 	/* fore channel */
280 	return nfs4_drain_slot_tbl(&ses->fc_slot_table);
281 }
282 
283 #if defined(CONFIG_NFS_V4_1)
284 
285 static int nfs41_setup_state_renewal(struct nfs_client *clp)
286 {
287 	int status;
288 	struct nfs_fsinfo fsinfo;
289 	unsigned long now;
290 
291 	if (!test_bit(NFS_CS_CHECK_LEASE_TIME, &clp->cl_res_state)) {
292 		nfs4_schedule_state_renewal(clp);
293 		return 0;
294 	}
295 
296 	now = jiffies;
297 	status = nfs4_proc_get_lease_time(clp, &fsinfo);
298 	if (status == 0) {
299 		nfs4_set_lease_period(clp, fsinfo.lease_time * HZ, now);
300 		nfs4_schedule_state_renewal(clp);
301 	}
302 
303 	return status;
304 }
305 
306 static void nfs41_finish_session_reset(struct nfs_client *clp)
307 {
308 	clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
309 	clear_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state);
310 	/* create_session negotiated new slot table */
311 	clear_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state);
312 	nfs41_setup_state_renewal(clp);
313 }
314 
315 int nfs41_init_clientid(struct nfs_client *clp, const struct cred *cred)
316 {
317 	int status;
318 
319 	if (test_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state))
320 		goto do_confirm;
321 	status = nfs4_proc_exchange_id(clp, cred);
322 	if (status != 0)
323 		goto out;
324 	set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
325 do_confirm:
326 	status = nfs4_proc_create_session(clp, cred);
327 	if (status != 0)
328 		goto out;
329 	nfs41_finish_session_reset(clp);
330 	nfs_mark_client_ready(clp, NFS_CS_READY);
331 out:
332 	return status;
333 }
334 
335 /**
336  * nfs41_discover_server_trunking - Detect server IP address trunking (mv1)
337  *
338  * @clp: nfs_client under test
339  * @result: OUT: found nfs_client, or clp
340  * @cred: credential to use for trunking test
341  *
342  * Returns NFS4_OK, a negative errno, or a negative NFS4ERR status.
343  * If NFS4_OK is returned, an nfs_client pointer is planted in
344  * "result".
345  *
346  * Note: The returned client may not yet be marked ready.
347  */
348 int nfs41_discover_server_trunking(struct nfs_client *clp,
349 				   struct nfs_client **result,
350 				   const struct cred *cred)
351 {
352 	int status;
353 
354 	status = nfs4_proc_exchange_id(clp, cred);
355 	if (status != NFS4_OK)
356 		return status;
357 
358 	status = nfs41_walk_client_list(clp, result, cred);
359 	if (status < 0)
360 		return status;
361 	if (clp != *result)
362 		return 0;
363 
364 	/*
365 	 * Purge state if the client id was established in a prior
366 	 * instance and the client id could not have arrived on the
367 	 * server via Transparent State Migration.
368 	 */
369 	if (clp->cl_exchange_flags & EXCHGID4_FLAG_CONFIRMED_R) {
370 		if (!test_bit(NFS_CS_TSM_POSSIBLE, &clp->cl_flags))
371 			set_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state);
372 		else
373 			set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
374 	}
375 	nfs4_schedule_state_manager(clp);
376 	status = nfs_wait_client_init_complete(clp);
377 	if (status < 0)
378 		nfs_put_client(clp);
379 	return status;
380 }
381 
382 #endif /* CONFIG_NFS_V4_1 */
383 
384 /**
385  * nfs4_get_clid_cred - Acquire credential for a setclientid operation
386  * @clp: client state handle
387  *
388  * Returns a cred with reference count bumped, or NULL.
389  */
390 const struct cred *nfs4_get_clid_cred(struct nfs_client *clp)
391 {
392 	const struct cred *cred;
393 
394 	cred = nfs4_get_machine_cred(clp);
395 	return cred;
396 }
397 
398 static struct nfs4_state_owner *
399 nfs4_find_state_owner_locked(struct nfs_server *server, const struct cred *cred)
400 {
401 	struct rb_node **p = &server->state_owners.rb_node,
402 		       *parent = NULL;
403 	struct nfs4_state_owner *sp;
404 	int cmp;
405 
406 	while (*p != NULL) {
407 		parent = *p;
408 		sp = rb_entry(parent, struct nfs4_state_owner, so_server_node);
409 		cmp = cred_fscmp(cred, sp->so_cred);
410 
411 		if (cmp < 0)
412 			p = &parent->rb_left;
413 		else if (cmp > 0)
414 			p = &parent->rb_right;
415 		else {
416 			if (!list_empty(&sp->so_lru))
417 				list_del_init(&sp->so_lru);
418 			atomic_inc(&sp->so_count);
419 			return sp;
420 		}
421 	}
422 	return NULL;
423 }
424 
425 static struct nfs4_state_owner *
426 nfs4_insert_state_owner_locked(struct nfs4_state_owner *new)
427 {
428 	struct nfs_server *server = new->so_server;
429 	struct rb_node **p = &server->state_owners.rb_node,
430 		       *parent = NULL;
431 	struct nfs4_state_owner *sp;
432 	int cmp;
433 
434 	while (*p != NULL) {
435 		parent = *p;
436 		sp = rb_entry(parent, struct nfs4_state_owner, so_server_node);
437 		cmp = cred_fscmp(new->so_cred, sp->so_cred);
438 
439 		if (cmp < 0)
440 			p = &parent->rb_left;
441 		else if (cmp > 0)
442 			p = &parent->rb_right;
443 		else {
444 			if (!list_empty(&sp->so_lru))
445 				list_del_init(&sp->so_lru);
446 			atomic_inc(&sp->so_count);
447 			return sp;
448 		}
449 	}
450 	rb_link_node(&new->so_server_node, parent, p);
451 	rb_insert_color(&new->so_server_node, &server->state_owners);
452 	return new;
453 }
454 
455 static void
456 nfs4_remove_state_owner_locked(struct nfs4_state_owner *sp)
457 {
458 	struct nfs_server *server = sp->so_server;
459 
460 	if (!RB_EMPTY_NODE(&sp->so_server_node))
461 		rb_erase(&sp->so_server_node, &server->state_owners);
462 }
463 
464 static void
465 nfs4_init_seqid_counter(struct nfs_seqid_counter *sc)
466 {
467 	sc->create_time = ktime_get();
468 	sc->flags = 0;
469 	sc->counter = 0;
470 	spin_lock_init(&sc->lock);
471 	INIT_LIST_HEAD(&sc->list);
472 	rpc_init_wait_queue(&sc->wait, "Seqid_waitqueue");
473 }
474 
475 static void
476 nfs4_destroy_seqid_counter(struct nfs_seqid_counter *sc)
477 {
478 	rpc_destroy_wait_queue(&sc->wait);
479 }
480 
481 /*
482  * nfs4_alloc_state_owner(): this is called on the OPEN or CREATE path to
483  * create a new state_owner.
484  *
485  */
486 static struct nfs4_state_owner *
487 nfs4_alloc_state_owner(struct nfs_server *server,
488 		const struct cred *cred,
489 		gfp_t gfp_flags)
490 {
491 	struct nfs4_state_owner *sp;
492 
493 	sp = kzalloc(sizeof(*sp), gfp_flags);
494 	if (!sp)
495 		return NULL;
496 	sp->so_seqid.owner_id = ida_simple_get(&server->openowner_id, 0, 0,
497 						gfp_flags);
498 	if (sp->so_seqid.owner_id < 0) {
499 		kfree(sp);
500 		return NULL;
501 	}
502 	sp->so_server = server;
503 	sp->so_cred = get_cred(cred);
504 	spin_lock_init(&sp->so_lock);
505 	INIT_LIST_HEAD(&sp->so_states);
506 	nfs4_init_seqid_counter(&sp->so_seqid);
507 	atomic_set(&sp->so_count, 1);
508 	INIT_LIST_HEAD(&sp->so_lru);
509 	seqcount_init(&sp->so_reclaim_seqcount);
510 	mutex_init(&sp->so_delegreturn_mutex);
511 	return sp;
512 }
513 
514 static void
515 nfs4_reset_state_owner(struct nfs4_state_owner *sp)
516 {
517 	/* This state_owner is no longer usable, but must
518 	 * remain in place so that state recovery can find it
519 	 * and the opens associated with it.
520 	 * It may also be used for new 'open' request to
521 	 * return a delegation to the server.
522 	 * So update the 'create_time' so that it looks like
523 	 * a new state_owner.  This will cause the server to
524 	 * request an OPEN_CONFIRM to start a new sequence.
525 	 */
526 	sp->so_seqid.create_time = ktime_get();
527 }
528 
529 static void nfs4_free_state_owner(struct nfs4_state_owner *sp)
530 {
531 	nfs4_destroy_seqid_counter(&sp->so_seqid);
532 	put_cred(sp->so_cred);
533 	ida_simple_remove(&sp->so_server->openowner_id, sp->so_seqid.owner_id);
534 	kfree(sp);
535 }
536 
537 static void nfs4_gc_state_owners(struct nfs_server *server)
538 {
539 	struct nfs_client *clp = server->nfs_client;
540 	struct nfs4_state_owner *sp, *tmp;
541 	unsigned long time_min, time_max;
542 	LIST_HEAD(doomed);
543 
544 	spin_lock(&clp->cl_lock);
545 	time_max = jiffies;
546 	time_min = (long)time_max - (long)clp->cl_lease_time;
547 	list_for_each_entry_safe(sp, tmp, &server->state_owners_lru, so_lru) {
548 		/* NB: LRU is sorted so that oldest is at the head */
549 		if (time_in_range(sp->so_expires, time_min, time_max))
550 			break;
551 		list_move(&sp->so_lru, &doomed);
552 		nfs4_remove_state_owner_locked(sp);
553 	}
554 	spin_unlock(&clp->cl_lock);
555 
556 	list_for_each_entry_safe(sp, tmp, &doomed, so_lru) {
557 		list_del(&sp->so_lru);
558 		nfs4_free_state_owner(sp);
559 	}
560 }
561 
562 /**
563  * nfs4_get_state_owner - Look up a state owner given a credential
564  * @server: nfs_server to search
565  * @cred: RPC credential to match
566  *
567  * Returns a pointer to an instantiated nfs4_state_owner struct, or NULL.
568  */
569 struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *server,
570 					      const struct cred *cred,
571 					      gfp_t gfp_flags)
572 {
573 	struct nfs_client *clp = server->nfs_client;
574 	struct nfs4_state_owner *sp, *new;
575 
576 	spin_lock(&clp->cl_lock);
577 	sp = nfs4_find_state_owner_locked(server, cred);
578 	spin_unlock(&clp->cl_lock);
579 	if (sp != NULL)
580 		goto out;
581 	new = nfs4_alloc_state_owner(server, cred, gfp_flags);
582 	if (new == NULL)
583 		goto out;
584 	spin_lock(&clp->cl_lock);
585 	sp = nfs4_insert_state_owner_locked(new);
586 	spin_unlock(&clp->cl_lock);
587 	if (sp != new)
588 		nfs4_free_state_owner(new);
589 out:
590 	nfs4_gc_state_owners(server);
591 	return sp;
592 }
593 
594 /**
595  * nfs4_put_state_owner - Release a nfs4_state_owner
596  * @sp: state owner data to release
597  *
598  * Note that we keep released state owners on an LRU
599  * list.
600  * This caches valid state owners so that they can be
601  * reused, to avoid the OPEN_CONFIRM on minor version 0.
602  * It also pins the uniquifier of dropped state owners for
603  * a while, to ensure that those state owner names are
604  * never reused.
605  */
606 void nfs4_put_state_owner(struct nfs4_state_owner *sp)
607 {
608 	struct nfs_server *server = sp->so_server;
609 	struct nfs_client *clp = server->nfs_client;
610 
611 	if (!atomic_dec_and_lock(&sp->so_count, &clp->cl_lock))
612 		return;
613 
614 	sp->so_expires = jiffies;
615 	list_add_tail(&sp->so_lru, &server->state_owners_lru);
616 	spin_unlock(&clp->cl_lock);
617 }
618 
619 /**
620  * nfs4_purge_state_owners - Release all cached state owners
621  * @server: nfs_server with cached state owners to release
622  *
623  * Called at umount time.  Remaining state owners will be on
624  * the LRU with ref count of zero.
625  */
626 void nfs4_purge_state_owners(struct nfs_server *server)
627 {
628 	struct nfs_client *clp = server->nfs_client;
629 	struct nfs4_state_owner *sp, *tmp;
630 	LIST_HEAD(doomed);
631 
632 	spin_lock(&clp->cl_lock);
633 	list_for_each_entry_safe(sp, tmp, &server->state_owners_lru, so_lru) {
634 		list_move(&sp->so_lru, &doomed);
635 		nfs4_remove_state_owner_locked(sp);
636 	}
637 	spin_unlock(&clp->cl_lock);
638 
639 	list_for_each_entry_safe(sp, tmp, &doomed, so_lru) {
640 		list_del(&sp->so_lru);
641 		nfs4_free_state_owner(sp);
642 	}
643 }
644 
645 static struct nfs4_state *
646 nfs4_alloc_open_state(void)
647 {
648 	struct nfs4_state *state;
649 
650 	state = kzalloc(sizeof(*state), GFP_NOFS);
651 	if (!state)
652 		return NULL;
653 	refcount_set(&state->count, 1);
654 	INIT_LIST_HEAD(&state->lock_states);
655 	spin_lock_init(&state->state_lock);
656 	seqlock_init(&state->seqlock);
657 	init_waitqueue_head(&state->waitq);
658 	return state;
659 }
660 
661 void
662 nfs4_state_set_mode_locked(struct nfs4_state *state, fmode_t fmode)
663 {
664 	if (state->state == fmode)
665 		return;
666 	/* NB! List reordering - see the reclaim code for why.  */
667 	if ((fmode & FMODE_WRITE) != (state->state & FMODE_WRITE)) {
668 		if (fmode & FMODE_WRITE)
669 			list_move(&state->open_states, &state->owner->so_states);
670 		else
671 			list_move_tail(&state->open_states, &state->owner->so_states);
672 	}
673 	state->state = fmode;
674 }
675 
676 static struct nfs4_state *
677 __nfs4_find_state_byowner(struct inode *inode, struct nfs4_state_owner *owner)
678 {
679 	struct nfs_inode *nfsi = NFS_I(inode);
680 	struct nfs4_state *state;
681 
682 	list_for_each_entry_rcu(state, &nfsi->open_states, inode_states) {
683 		if (state->owner != owner)
684 			continue;
685 		if (!nfs4_valid_open_stateid(state))
686 			continue;
687 		if (refcount_inc_not_zero(&state->count))
688 			return state;
689 	}
690 	return NULL;
691 }
692 
693 static void
694 nfs4_free_open_state(struct nfs4_state *state)
695 {
696 	kfree_rcu(state, rcu_head);
697 }
698 
699 struct nfs4_state *
700 nfs4_get_open_state(struct inode *inode, struct nfs4_state_owner *owner)
701 {
702 	struct nfs4_state *state, *new;
703 	struct nfs_inode *nfsi = NFS_I(inode);
704 
705 	rcu_read_lock();
706 	state = __nfs4_find_state_byowner(inode, owner);
707 	rcu_read_unlock();
708 	if (state)
709 		goto out;
710 	new = nfs4_alloc_open_state();
711 	spin_lock(&owner->so_lock);
712 	spin_lock(&inode->i_lock);
713 	state = __nfs4_find_state_byowner(inode, owner);
714 	if (state == NULL && new != NULL) {
715 		state = new;
716 		state->owner = owner;
717 		atomic_inc(&owner->so_count);
718 		list_add_rcu(&state->inode_states, &nfsi->open_states);
719 		ihold(inode);
720 		state->inode = inode;
721 		spin_unlock(&inode->i_lock);
722 		/* Note: The reclaim code dictates that we add stateless
723 		 * and read-only stateids to the end of the list */
724 		list_add_tail(&state->open_states, &owner->so_states);
725 		spin_unlock(&owner->so_lock);
726 	} else {
727 		spin_unlock(&inode->i_lock);
728 		spin_unlock(&owner->so_lock);
729 		if (new)
730 			nfs4_free_open_state(new);
731 	}
732 out:
733 	return state;
734 }
735 
736 void nfs4_put_open_state(struct nfs4_state *state)
737 {
738 	struct inode *inode = state->inode;
739 	struct nfs4_state_owner *owner = state->owner;
740 
741 	if (!refcount_dec_and_lock(&state->count, &owner->so_lock))
742 		return;
743 	spin_lock(&inode->i_lock);
744 	list_del_rcu(&state->inode_states);
745 	list_del(&state->open_states);
746 	spin_unlock(&inode->i_lock);
747 	spin_unlock(&owner->so_lock);
748 	iput(inode);
749 	nfs4_free_open_state(state);
750 	nfs4_put_state_owner(owner);
751 }
752 
753 /*
754  * Close the current file.
755  */
756 static void __nfs4_close(struct nfs4_state *state,
757 		fmode_t fmode, gfp_t gfp_mask, int wait)
758 {
759 	struct nfs4_state_owner *owner = state->owner;
760 	int call_close = 0;
761 	fmode_t newstate;
762 
763 	atomic_inc(&owner->so_count);
764 	/* Protect against nfs4_find_state() */
765 	spin_lock(&owner->so_lock);
766 	switch (fmode & (FMODE_READ | FMODE_WRITE)) {
767 		case FMODE_READ:
768 			state->n_rdonly--;
769 			break;
770 		case FMODE_WRITE:
771 			state->n_wronly--;
772 			break;
773 		case FMODE_READ|FMODE_WRITE:
774 			state->n_rdwr--;
775 	}
776 	newstate = FMODE_READ|FMODE_WRITE;
777 	if (state->n_rdwr == 0) {
778 		if (state->n_rdonly == 0) {
779 			newstate &= ~FMODE_READ;
780 			call_close |= test_bit(NFS_O_RDONLY_STATE, &state->flags);
781 			call_close |= test_bit(NFS_O_RDWR_STATE, &state->flags);
782 		}
783 		if (state->n_wronly == 0) {
784 			newstate &= ~FMODE_WRITE;
785 			call_close |= test_bit(NFS_O_WRONLY_STATE, &state->flags);
786 			call_close |= test_bit(NFS_O_RDWR_STATE, &state->flags);
787 		}
788 		if (newstate == 0)
789 			clear_bit(NFS_DELEGATED_STATE, &state->flags);
790 	}
791 	nfs4_state_set_mode_locked(state, newstate);
792 	spin_unlock(&owner->so_lock);
793 
794 	if (!call_close) {
795 		nfs4_put_open_state(state);
796 		nfs4_put_state_owner(owner);
797 	} else
798 		nfs4_do_close(state, gfp_mask, wait);
799 }
800 
801 void nfs4_close_state(struct nfs4_state *state, fmode_t fmode)
802 {
803 	__nfs4_close(state, fmode, GFP_NOFS, 0);
804 }
805 
806 void nfs4_close_sync(struct nfs4_state *state, fmode_t fmode)
807 {
808 	__nfs4_close(state, fmode, GFP_KERNEL, 1);
809 }
810 
811 /*
812  * Search the state->lock_states for an existing lock_owner
813  * that is compatible with either of the given owners.
814  * If the second is non-zero, then the first refers to a Posix-lock
815  * owner (current->files) and the second refers to a flock/OFD
816  * owner (struct file*).  In that case, prefer a match for the first
817  * owner.
818  * If both sorts of locks are held on the one file we cannot know
819  * which stateid was intended to be used, so a "correct" choice cannot
820  * be made.  Failing that, a "consistent" choice is preferable.  The
821  * consistent choice we make is to prefer the first owner, that of a
822  * Posix lock.
823  */
824 static struct nfs4_lock_state *
825 __nfs4_find_lock_state(struct nfs4_state *state,
826 		       fl_owner_t fl_owner, fl_owner_t fl_owner2)
827 {
828 	struct nfs4_lock_state *pos, *ret = NULL;
829 	list_for_each_entry(pos, &state->lock_states, ls_locks) {
830 		if (pos->ls_owner == fl_owner) {
831 			ret = pos;
832 			break;
833 		}
834 		if (pos->ls_owner == fl_owner2)
835 			ret = pos;
836 	}
837 	if (ret)
838 		refcount_inc(&ret->ls_count);
839 	return ret;
840 }
841 
842 /*
843  * Return a compatible lock_state. If no initialized lock_state structure
844  * exists, return an uninitialized one.
845  *
846  */
847 static struct nfs4_lock_state *nfs4_alloc_lock_state(struct nfs4_state *state, fl_owner_t fl_owner)
848 {
849 	struct nfs4_lock_state *lsp;
850 	struct nfs_server *server = state->owner->so_server;
851 
852 	lsp = kzalloc(sizeof(*lsp), GFP_NOFS);
853 	if (lsp == NULL)
854 		return NULL;
855 	nfs4_init_seqid_counter(&lsp->ls_seqid);
856 	refcount_set(&lsp->ls_count, 1);
857 	lsp->ls_state = state;
858 	lsp->ls_owner = fl_owner;
859 	lsp->ls_seqid.owner_id = ida_simple_get(&server->lockowner_id, 0, 0, GFP_NOFS);
860 	if (lsp->ls_seqid.owner_id < 0)
861 		goto out_free;
862 	INIT_LIST_HEAD(&lsp->ls_locks);
863 	return lsp;
864 out_free:
865 	kfree(lsp);
866 	return NULL;
867 }
868 
869 void nfs4_free_lock_state(struct nfs_server *server, struct nfs4_lock_state *lsp)
870 {
871 	ida_simple_remove(&server->lockowner_id, lsp->ls_seqid.owner_id);
872 	nfs4_destroy_seqid_counter(&lsp->ls_seqid);
873 	kfree(lsp);
874 }
875 
876 /*
877  * Return a compatible lock_state. If no initialized lock_state structure
878  * exists, return an uninitialized one.
879  *
880  */
881 static struct nfs4_lock_state *nfs4_get_lock_state(struct nfs4_state *state, fl_owner_t owner)
882 {
883 	struct nfs4_lock_state *lsp, *new = NULL;
884 
885 	for(;;) {
886 		spin_lock(&state->state_lock);
887 		lsp = __nfs4_find_lock_state(state, owner, NULL);
888 		if (lsp != NULL)
889 			break;
890 		if (new != NULL) {
891 			list_add(&new->ls_locks, &state->lock_states);
892 			set_bit(LK_STATE_IN_USE, &state->flags);
893 			lsp = new;
894 			new = NULL;
895 			break;
896 		}
897 		spin_unlock(&state->state_lock);
898 		new = nfs4_alloc_lock_state(state, owner);
899 		if (new == NULL)
900 			return NULL;
901 	}
902 	spin_unlock(&state->state_lock);
903 	if (new != NULL)
904 		nfs4_free_lock_state(state->owner->so_server, new);
905 	return lsp;
906 }
907 
908 /*
909  * Release reference to lock_state, and free it if we see that
910  * it is no longer in use
911  */
912 void nfs4_put_lock_state(struct nfs4_lock_state *lsp)
913 {
914 	struct nfs_server *server;
915 	struct nfs4_state *state;
916 
917 	if (lsp == NULL)
918 		return;
919 	state = lsp->ls_state;
920 	if (!refcount_dec_and_lock(&lsp->ls_count, &state->state_lock))
921 		return;
922 	list_del(&lsp->ls_locks);
923 	if (list_empty(&state->lock_states))
924 		clear_bit(LK_STATE_IN_USE, &state->flags);
925 	spin_unlock(&state->state_lock);
926 	server = state->owner->so_server;
927 	if (test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags)) {
928 		struct nfs_client *clp = server->nfs_client;
929 
930 		clp->cl_mvops->free_lock_state(server, lsp);
931 	} else
932 		nfs4_free_lock_state(server, lsp);
933 }
934 
935 static void nfs4_fl_copy_lock(struct file_lock *dst, struct file_lock *src)
936 {
937 	struct nfs4_lock_state *lsp = src->fl_u.nfs4_fl.owner;
938 
939 	dst->fl_u.nfs4_fl.owner = lsp;
940 	refcount_inc(&lsp->ls_count);
941 }
942 
943 static void nfs4_fl_release_lock(struct file_lock *fl)
944 {
945 	nfs4_put_lock_state(fl->fl_u.nfs4_fl.owner);
946 }
947 
948 static const struct file_lock_operations nfs4_fl_lock_ops = {
949 	.fl_copy_lock = nfs4_fl_copy_lock,
950 	.fl_release_private = nfs4_fl_release_lock,
951 };
952 
953 int nfs4_set_lock_state(struct nfs4_state *state, struct file_lock *fl)
954 {
955 	struct nfs4_lock_state *lsp;
956 
957 	if (fl->fl_ops != NULL)
958 		return 0;
959 	lsp = nfs4_get_lock_state(state, fl->fl_owner);
960 	if (lsp == NULL)
961 		return -ENOMEM;
962 	fl->fl_u.nfs4_fl.owner = lsp;
963 	fl->fl_ops = &nfs4_fl_lock_ops;
964 	return 0;
965 }
966 
967 static int nfs4_copy_lock_stateid(nfs4_stateid *dst,
968 		struct nfs4_state *state,
969 		const struct nfs_lock_context *l_ctx)
970 {
971 	struct nfs4_lock_state *lsp;
972 	fl_owner_t fl_owner, fl_flock_owner;
973 	int ret = -ENOENT;
974 
975 	if (l_ctx == NULL)
976 		goto out;
977 
978 	if (test_bit(LK_STATE_IN_USE, &state->flags) == 0)
979 		goto out;
980 
981 	fl_owner = l_ctx->lockowner;
982 	fl_flock_owner = l_ctx->open_context->flock_owner;
983 
984 	spin_lock(&state->state_lock);
985 	lsp = __nfs4_find_lock_state(state, fl_owner, fl_flock_owner);
986 	if (lsp && test_bit(NFS_LOCK_LOST, &lsp->ls_flags))
987 		ret = -EIO;
988 	else if (lsp != NULL && test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags) != 0) {
989 		nfs4_stateid_copy(dst, &lsp->ls_stateid);
990 		ret = 0;
991 	}
992 	spin_unlock(&state->state_lock);
993 	nfs4_put_lock_state(lsp);
994 out:
995 	return ret;
996 }
997 
998 bool nfs4_refresh_open_stateid(nfs4_stateid *dst, struct nfs4_state *state)
999 {
1000 	bool ret;
1001 	int seq;
1002 
1003 	do {
1004 		ret = false;
1005 		seq = read_seqbegin(&state->seqlock);
1006 		if (nfs4_state_match_open_stateid_other(state, dst)) {
1007 			dst->seqid = state->open_stateid.seqid;
1008 			ret = true;
1009 		}
1010 	} while (read_seqretry(&state->seqlock, seq));
1011 	return ret;
1012 }
1013 
1014 bool nfs4_copy_open_stateid(nfs4_stateid *dst, struct nfs4_state *state)
1015 {
1016 	bool ret;
1017 	const nfs4_stateid *src;
1018 	int seq;
1019 
1020 	do {
1021 		ret = false;
1022 		src = &zero_stateid;
1023 		seq = read_seqbegin(&state->seqlock);
1024 		if (test_bit(NFS_OPEN_STATE, &state->flags)) {
1025 			src = &state->open_stateid;
1026 			ret = true;
1027 		}
1028 		nfs4_stateid_copy(dst, src);
1029 	} while (read_seqretry(&state->seqlock, seq));
1030 	return ret;
1031 }
1032 
1033 /*
1034  * Byte-range lock aware utility to initialize the stateid of read/write
1035  * requests.
1036  */
1037 int nfs4_select_rw_stateid(struct nfs4_state *state,
1038 		fmode_t fmode, const struct nfs_lock_context *l_ctx,
1039 		nfs4_stateid *dst, const struct cred **cred)
1040 {
1041 	int ret;
1042 
1043 	if (!nfs4_valid_open_stateid(state))
1044 		return -EIO;
1045 	if (cred != NULL)
1046 		*cred = NULL;
1047 	ret = nfs4_copy_lock_stateid(dst, state, l_ctx);
1048 	if (ret == -EIO)
1049 		/* A lost lock - don't even consider delegations */
1050 		goto out;
1051 	/* returns true if delegation stateid found and copied */
1052 	if (nfs4_copy_delegation_stateid(state->inode, fmode, dst, cred)) {
1053 		ret = 0;
1054 		goto out;
1055 	}
1056 	if (ret != -ENOENT)
1057 		/* nfs4_copy_delegation_stateid() didn't over-write
1058 		 * dst, so it still has the lock stateid which we now
1059 		 * choose to use.
1060 		 */
1061 		goto out;
1062 	nfs4_copy_open_stateid(dst, state);
1063 	ret = 0;
1064 out:
1065 	if (nfs_server_capable(state->inode, NFS_CAP_STATEID_NFSV41))
1066 		dst->seqid = 0;
1067 	return ret;
1068 }
1069 
1070 struct nfs_seqid *nfs_alloc_seqid(struct nfs_seqid_counter *counter, gfp_t gfp_mask)
1071 {
1072 	struct nfs_seqid *new;
1073 
1074 	new = kmalloc(sizeof(*new), gfp_mask);
1075 	if (new == NULL)
1076 		return ERR_PTR(-ENOMEM);
1077 	new->sequence = counter;
1078 	INIT_LIST_HEAD(&new->list);
1079 	new->task = NULL;
1080 	return new;
1081 }
1082 
1083 void nfs_release_seqid(struct nfs_seqid *seqid)
1084 {
1085 	struct nfs_seqid_counter *sequence;
1086 
1087 	if (seqid == NULL || list_empty(&seqid->list))
1088 		return;
1089 	sequence = seqid->sequence;
1090 	spin_lock(&sequence->lock);
1091 	list_del_init(&seqid->list);
1092 	if (!list_empty(&sequence->list)) {
1093 		struct nfs_seqid *next;
1094 
1095 		next = list_first_entry(&sequence->list,
1096 				struct nfs_seqid, list);
1097 		rpc_wake_up_queued_task(&sequence->wait, next->task);
1098 	}
1099 	spin_unlock(&sequence->lock);
1100 }
1101 
1102 void nfs_free_seqid(struct nfs_seqid *seqid)
1103 {
1104 	nfs_release_seqid(seqid);
1105 	kfree(seqid);
1106 }
1107 
1108 /*
1109  * Increment the seqid if the OPEN/OPEN_DOWNGRADE/CLOSE succeeded, or
1110  * failed with a seqid incrementing error -
1111  * see comments nfs4.h:seqid_mutating_error()
1112  */
1113 static void nfs_increment_seqid(int status, struct nfs_seqid *seqid)
1114 {
1115 	switch (status) {
1116 		case 0:
1117 			break;
1118 		case -NFS4ERR_BAD_SEQID:
1119 			if (seqid->sequence->flags & NFS_SEQID_CONFIRMED)
1120 				return;
1121 			pr_warn_ratelimited("NFS: v4 server returned a bad"
1122 					" sequence-id error on an"
1123 					" unconfirmed sequence %p!\n",
1124 					seqid->sequence);
1125 		case -NFS4ERR_STALE_CLIENTID:
1126 		case -NFS4ERR_STALE_STATEID:
1127 		case -NFS4ERR_BAD_STATEID:
1128 		case -NFS4ERR_BADXDR:
1129 		case -NFS4ERR_RESOURCE:
1130 		case -NFS4ERR_NOFILEHANDLE:
1131 		case -NFS4ERR_MOVED:
1132 			/* Non-seqid mutating errors */
1133 			return;
1134 	};
1135 	/*
1136 	 * Note: no locking needed as we are guaranteed to be first
1137 	 * on the sequence list
1138 	 */
1139 	seqid->sequence->counter++;
1140 }
1141 
1142 void nfs_increment_open_seqid(int status, struct nfs_seqid *seqid)
1143 {
1144 	struct nfs4_state_owner *sp;
1145 
1146 	if (seqid == NULL)
1147 		return;
1148 
1149 	sp = container_of(seqid->sequence, struct nfs4_state_owner, so_seqid);
1150 	if (status == -NFS4ERR_BAD_SEQID)
1151 		nfs4_reset_state_owner(sp);
1152 	if (!nfs4_has_session(sp->so_server->nfs_client))
1153 		nfs_increment_seqid(status, seqid);
1154 }
1155 
1156 /*
1157  * Increment the seqid if the LOCK/LOCKU succeeded, or
1158  * failed with a seqid incrementing error -
1159  * see comments nfs4.h:seqid_mutating_error()
1160  */
1161 void nfs_increment_lock_seqid(int status, struct nfs_seqid *seqid)
1162 {
1163 	if (seqid != NULL)
1164 		nfs_increment_seqid(status, seqid);
1165 }
1166 
1167 int nfs_wait_on_sequence(struct nfs_seqid *seqid, struct rpc_task *task)
1168 {
1169 	struct nfs_seqid_counter *sequence;
1170 	int status = 0;
1171 
1172 	if (seqid == NULL)
1173 		goto out;
1174 	sequence = seqid->sequence;
1175 	spin_lock(&sequence->lock);
1176 	seqid->task = task;
1177 	if (list_empty(&seqid->list))
1178 		list_add_tail(&seqid->list, &sequence->list);
1179 	if (list_first_entry(&sequence->list, struct nfs_seqid, list) == seqid)
1180 		goto unlock;
1181 	rpc_sleep_on(&sequence->wait, task, NULL);
1182 	status = -EAGAIN;
1183 unlock:
1184 	spin_unlock(&sequence->lock);
1185 out:
1186 	return status;
1187 }
1188 
1189 static int nfs4_run_state_manager(void *);
1190 
1191 static void nfs4_clear_state_manager_bit(struct nfs_client *clp)
1192 {
1193 	smp_mb__before_atomic();
1194 	clear_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state);
1195 	smp_mb__after_atomic();
1196 	wake_up_bit(&clp->cl_state, NFS4CLNT_MANAGER_RUNNING);
1197 	rpc_wake_up(&clp->cl_rpcwaitq);
1198 }
1199 
1200 /*
1201  * Schedule the nfs_client asynchronous state management routine
1202  */
1203 void nfs4_schedule_state_manager(struct nfs_client *clp)
1204 {
1205 	struct task_struct *task;
1206 	char buf[INET6_ADDRSTRLEN + sizeof("-manager") + 1];
1207 
1208 	set_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state);
1209 	if (test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) != 0)
1210 		return;
1211 	__module_get(THIS_MODULE);
1212 	refcount_inc(&clp->cl_count);
1213 
1214 	/* The rcu_read_lock() is not strictly necessary, as the state
1215 	 * manager is the only thread that ever changes the rpc_xprt
1216 	 * after it's initialized.  At this point, we're single threaded. */
1217 	rcu_read_lock();
1218 	snprintf(buf, sizeof(buf), "%s-manager",
1219 			rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_ADDR));
1220 	rcu_read_unlock();
1221 	task = kthread_run(nfs4_run_state_manager, clp, "%s", buf);
1222 	if (IS_ERR(task)) {
1223 		printk(KERN_ERR "%s: kthread_run: %ld\n",
1224 			__func__, PTR_ERR(task));
1225 		nfs4_clear_state_manager_bit(clp);
1226 		nfs_put_client(clp);
1227 		module_put(THIS_MODULE);
1228 	}
1229 }
1230 
1231 /*
1232  * Schedule a lease recovery attempt
1233  */
1234 void nfs4_schedule_lease_recovery(struct nfs_client *clp)
1235 {
1236 	if (!clp)
1237 		return;
1238 	if (!test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state))
1239 		set_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state);
1240 	dprintk("%s: scheduling lease recovery for server %s\n", __func__,
1241 			clp->cl_hostname);
1242 	nfs4_schedule_state_manager(clp);
1243 }
1244 EXPORT_SYMBOL_GPL(nfs4_schedule_lease_recovery);
1245 
1246 /**
1247  * nfs4_schedule_migration_recovery - trigger migration recovery
1248  *
1249  * @server: FSID that is migrating
1250  *
1251  * Returns zero if recovery has started, otherwise a negative NFS4ERR
1252  * value is returned.
1253  */
1254 int nfs4_schedule_migration_recovery(const struct nfs_server *server)
1255 {
1256 	struct nfs_client *clp = server->nfs_client;
1257 
1258 	if (server->fh_expire_type != NFS4_FH_PERSISTENT) {
1259 		pr_err("NFS: volatile file handles not supported (server %s)\n",
1260 				clp->cl_hostname);
1261 		return -NFS4ERR_IO;
1262 	}
1263 
1264 	if (test_bit(NFS_MIG_FAILED, &server->mig_status))
1265 		return -NFS4ERR_IO;
1266 
1267 	dprintk("%s: scheduling migration recovery for (%llx:%llx) on %s\n",
1268 			__func__,
1269 			(unsigned long long)server->fsid.major,
1270 			(unsigned long long)server->fsid.minor,
1271 			clp->cl_hostname);
1272 
1273 	set_bit(NFS_MIG_IN_TRANSITION,
1274 			&((struct nfs_server *)server)->mig_status);
1275 	set_bit(NFS4CLNT_MOVED, &clp->cl_state);
1276 
1277 	nfs4_schedule_state_manager(clp);
1278 	return 0;
1279 }
1280 EXPORT_SYMBOL_GPL(nfs4_schedule_migration_recovery);
1281 
1282 /**
1283  * nfs4_schedule_lease_moved_recovery - start lease-moved recovery
1284  *
1285  * @clp: server to check for moved leases
1286  *
1287  */
1288 void nfs4_schedule_lease_moved_recovery(struct nfs_client *clp)
1289 {
1290 	dprintk("%s: scheduling lease-moved recovery for client ID %llx on %s\n",
1291 		__func__, clp->cl_clientid, clp->cl_hostname);
1292 
1293 	set_bit(NFS4CLNT_LEASE_MOVED, &clp->cl_state);
1294 	nfs4_schedule_state_manager(clp);
1295 }
1296 EXPORT_SYMBOL_GPL(nfs4_schedule_lease_moved_recovery);
1297 
1298 int nfs4_wait_clnt_recover(struct nfs_client *clp)
1299 {
1300 	int res;
1301 
1302 	might_sleep();
1303 
1304 	refcount_inc(&clp->cl_count);
1305 	res = wait_on_bit_action(&clp->cl_state, NFS4CLNT_MANAGER_RUNNING,
1306 				 nfs_wait_bit_killable, TASK_KILLABLE);
1307 	if (res)
1308 		goto out;
1309 	if (clp->cl_cons_state < 0)
1310 		res = clp->cl_cons_state;
1311 out:
1312 	nfs_put_client(clp);
1313 	return res;
1314 }
1315 
1316 int nfs4_client_recover_expired_lease(struct nfs_client *clp)
1317 {
1318 	unsigned int loop;
1319 	int ret;
1320 
1321 	for (loop = NFS4_MAX_LOOP_ON_RECOVER; loop != 0; loop--) {
1322 		ret = nfs4_wait_clnt_recover(clp);
1323 		if (ret != 0)
1324 			break;
1325 		if (!test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) &&
1326 		    !test_bit(NFS4CLNT_CHECK_LEASE,&clp->cl_state))
1327 			break;
1328 		nfs4_schedule_state_manager(clp);
1329 		ret = -EIO;
1330 	}
1331 	return ret;
1332 }
1333 
1334 /*
1335  * nfs40_handle_cb_pathdown - return all delegations after NFS4ERR_CB_PATH_DOWN
1336  * @clp: client to process
1337  *
1338  * Set the NFS4CLNT_LEASE_EXPIRED state in order to force a
1339  * resend of the SETCLIENTID and hence re-establish the
1340  * callback channel. Then return all existing delegations.
1341  */
1342 static void nfs40_handle_cb_pathdown(struct nfs_client *clp)
1343 {
1344 	set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
1345 	nfs_expire_all_delegations(clp);
1346 	dprintk("%s: handling CB_PATHDOWN recovery for server %s\n", __func__,
1347 			clp->cl_hostname);
1348 }
1349 
1350 void nfs4_schedule_path_down_recovery(struct nfs_client *clp)
1351 {
1352 	nfs40_handle_cb_pathdown(clp);
1353 	nfs4_schedule_state_manager(clp);
1354 }
1355 
1356 static int nfs4_state_mark_reclaim_reboot(struct nfs_client *clp, struct nfs4_state *state)
1357 {
1358 
1359 	if (!nfs4_valid_open_stateid(state))
1360 		return 0;
1361 	set_bit(NFS_STATE_RECLAIM_REBOOT, &state->flags);
1362 	/* Don't recover state that expired before the reboot */
1363 	if (test_bit(NFS_STATE_RECLAIM_NOGRACE, &state->flags)) {
1364 		clear_bit(NFS_STATE_RECLAIM_REBOOT, &state->flags);
1365 		return 0;
1366 	}
1367 	set_bit(NFS_OWNER_RECLAIM_REBOOT, &state->owner->so_flags);
1368 	set_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state);
1369 	return 1;
1370 }
1371 
1372 int nfs4_state_mark_reclaim_nograce(struct nfs_client *clp, struct nfs4_state *state)
1373 {
1374 	if (!nfs4_valid_open_stateid(state))
1375 		return 0;
1376 	set_bit(NFS_STATE_RECLAIM_NOGRACE, &state->flags);
1377 	clear_bit(NFS_STATE_RECLAIM_REBOOT, &state->flags);
1378 	set_bit(NFS_OWNER_RECLAIM_NOGRACE, &state->owner->so_flags);
1379 	set_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state);
1380 	return 1;
1381 }
1382 
1383 int nfs4_schedule_stateid_recovery(const struct nfs_server *server, struct nfs4_state *state)
1384 {
1385 	struct nfs_client *clp = server->nfs_client;
1386 
1387 	if (!nfs4_state_mark_reclaim_nograce(clp, state))
1388 		return -EBADF;
1389 	nfs_inode_find_delegation_state_and_recover(state->inode,
1390 			&state->stateid);
1391 	dprintk("%s: scheduling stateid recovery for server %s\n", __func__,
1392 			clp->cl_hostname);
1393 	nfs4_schedule_state_manager(clp);
1394 	return 0;
1395 }
1396 EXPORT_SYMBOL_GPL(nfs4_schedule_stateid_recovery);
1397 
1398 static struct nfs4_lock_state *
1399 nfs_state_find_lock_state_by_stateid(struct nfs4_state *state,
1400 		const nfs4_stateid *stateid)
1401 {
1402 	struct nfs4_lock_state *pos;
1403 
1404 	list_for_each_entry(pos, &state->lock_states, ls_locks) {
1405 		if (!test_bit(NFS_LOCK_INITIALIZED, &pos->ls_flags))
1406 			continue;
1407 		if (nfs4_stateid_match_other(&pos->ls_stateid, stateid))
1408 			return pos;
1409 	}
1410 	return NULL;
1411 }
1412 
1413 static bool nfs_state_lock_state_matches_stateid(struct nfs4_state *state,
1414 		const nfs4_stateid *stateid)
1415 {
1416 	bool found = false;
1417 
1418 	if (test_bit(LK_STATE_IN_USE, &state->flags)) {
1419 		spin_lock(&state->state_lock);
1420 		if (nfs_state_find_lock_state_by_stateid(state, stateid))
1421 			found = true;
1422 		spin_unlock(&state->state_lock);
1423 	}
1424 	return found;
1425 }
1426 
1427 void nfs_inode_find_state_and_recover(struct inode *inode,
1428 		const nfs4_stateid *stateid)
1429 {
1430 	struct nfs_client *clp = NFS_SERVER(inode)->nfs_client;
1431 	struct nfs_inode *nfsi = NFS_I(inode);
1432 	struct nfs_open_context *ctx;
1433 	struct nfs4_state *state;
1434 	bool found = false;
1435 
1436 	rcu_read_lock();
1437 	list_for_each_entry_rcu(ctx, &nfsi->open_files, list) {
1438 		state = ctx->state;
1439 		if (state == NULL)
1440 			continue;
1441 		if (nfs4_stateid_match_other(&state->stateid, stateid) &&
1442 		    nfs4_state_mark_reclaim_nograce(clp, state)) {
1443 			found = true;
1444 			continue;
1445 		}
1446 		if (nfs4_stateid_match_other(&state->open_stateid, stateid) &&
1447 		    nfs4_state_mark_reclaim_nograce(clp, state)) {
1448 			found = true;
1449 			continue;
1450 		}
1451 		if (nfs_state_lock_state_matches_stateid(state, stateid) &&
1452 		    nfs4_state_mark_reclaim_nograce(clp, state))
1453 			found = true;
1454 	}
1455 	rcu_read_unlock();
1456 
1457 	nfs_inode_find_delegation_state_and_recover(inode, stateid);
1458 	if (found)
1459 		nfs4_schedule_state_manager(clp);
1460 }
1461 
1462 static void nfs4_state_mark_open_context_bad(struct nfs4_state *state)
1463 {
1464 	struct inode *inode = state->inode;
1465 	struct nfs_inode *nfsi = NFS_I(inode);
1466 	struct nfs_open_context *ctx;
1467 
1468 	rcu_read_lock();
1469 	list_for_each_entry_rcu(ctx, &nfsi->open_files, list) {
1470 		if (ctx->state != state)
1471 			continue;
1472 		set_bit(NFS_CONTEXT_BAD, &ctx->flags);
1473 	}
1474 	rcu_read_unlock();
1475 }
1476 
1477 static void nfs4_state_mark_recovery_failed(struct nfs4_state *state, int error)
1478 {
1479 	set_bit(NFS_STATE_RECOVERY_FAILED, &state->flags);
1480 	nfs4_state_mark_open_context_bad(state);
1481 }
1482 
1483 
1484 static int nfs4_reclaim_locks(struct nfs4_state *state, const struct nfs4_state_recovery_ops *ops)
1485 {
1486 	struct inode *inode = state->inode;
1487 	struct nfs_inode *nfsi = NFS_I(inode);
1488 	struct file_lock *fl;
1489 	struct nfs4_lock_state *lsp;
1490 	int status = 0;
1491 	struct file_lock_context *flctx = inode->i_flctx;
1492 	struct list_head *list;
1493 
1494 	if (flctx == NULL)
1495 		return 0;
1496 
1497 	list = &flctx->flc_posix;
1498 
1499 	/* Guard against delegation returns and new lock/unlock calls */
1500 	down_write(&nfsi->rwsem);
1501 	spin_lock(&flctx->flc_lock);
1502 restart:
1503 	list_for_each_entry(fl, list, fl_list) {
1504 		if (nfs_file_open_context(fl->fl_file)->state != state)
1505 			continue;
1506 		spin_unlock(&flctx->flc_lock);
1507 		status = ops->recover_lock(state, fl);
1508 		switch (status) {
1509 		case 0:
1510 			break;
1511 		case -ESTALE:
1512 		case -NFS4ERR_ADMIN_REVOKED:
1513 		case -NFS4ERR_STALE_STATEID:
1514 		case -NFS4ERR_BAD_STATEID:
1515 		case -NFS4ERR_EXPIRED:
1516 		case -NFS4ERR_NO_GRACE:
1517 		case -NFS4ERR_STALE_CLIENTID:
1518 		case -NFS4ERR_BADSESSION:
1519 		case -NFS4ERR_BADSLOT:
1520 		case -NFS4ERR_BAD_HIGH_SLOT:
1521 		case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
1522 			goto out;
1523 		default:
1524 			pr_err("NFS: %s: unhandled error %d\n",
1525 					__func__, status);
1526 			/* Fall through */
1527 		case -ENOMEM:
1528 		case -NFS4ERR_DENIED:
1529 		case -NFS4ERR_RECLAIM_BAD:
1530 		case -NFS4ERR_RECLAIM_CONFLICT:
1531 			lsp = fl->fl_u.nfs4_fl.owner;
1532 			if (lsp)
1533 				set_bit(NFS_LOCK_LOST, &lsp->ls_flags);
1534 			status = 0;
1535 		}
1536 		spin_lock(&flctx->flc_lock);
1537 	}
1538 	if (list == &flctx->flc_posix) {
1539 		list = &flctx->flc_flock;
1540 		goto restart;
1541 	}
1542 	spin_unlock(&flctx->flc_lock);
1543 out:
1544 	up_write(&nfsi->rwsem);
1545 	return status;
1546 }
1547 
1548 #ifdef CONFIG_NFS_V4_2
1549 static void nfs42_complete_copies(struct nfs4_state_owner *sp, struct nfs4_state *state)
1550 {
1551 	struct nfs4_copy_state *copy;
1552 
1553 	if (!test_bit(NFS_CLNT_DST_SSC_COPY_STATE, &state->flags))
1554 		return;
1555 
1556 	spin_lock(&sp->so_server->nfs_client->cl_lock);
1557 	list_for_each_entry(copy, &sp->so_server->ss_copies, copies) {
1558 		if (!nfs4_stateid_match_other(&state->stateid, &copy->parent_state->stateid))
1559 			continue;
1560 		copy->flags = 1;
1561 		complete(&copy->completion);
1562 		break;
1563 	}
1564 	spin_unlock(&sp->so_server->nfs_client->cl_lock);
1565 }
1566 #else /* !CONFIG_NFS_V4_2 */
1567 static inline void nfs42_complete_copies(struct nfs4_state_owner *sp,
1568 					 struct nfs4_state *state)
1569 {
1570 }
1571 #endif /* CONFIG_NFS_V4_2 */
1572 
1573 static int __nfs4_reclaim_open_state(struct nfs4_state_owner *sp, struct nfs4_state *state,
1574 				     const struct nfs4_state_recovery_ops *ops)
1575 {
1576 	struct nfs4_lock_state *lock;
1577 	int status;
1578 
1579 	status = ops->recover_open(sp, state);
1580 	if (status < 0)
1581 		return status;
1582 
1583 	status = nfs4_reclaim_locks(state, ops);
1584 	if (status < 0)
1585 		return status;
1586 
1587 	if (!test_bit(NFS_DELEGATED_STATE, &state->flags)) {
1588 		spin_lock(&state->state_lock);
1589 		list_for_each_entry(lock, &state->lock_states, ls_locks) {
1590 			if (!test_bit(NFS_LOCK_INITIALIZED, &lock->ls_flags))
1591 				pr_warn_ratelimited("NFS: %s: Lock reclaim failed!\n", __func__);
1592 		}
1593 		spin_unlock(&state->state_lock);
1594 	}
1595 
1596 	nfs42_complete_copies(sp, state);
1597 	clear_bit(NFS_STATE_RECLAIM_NOGRACE, &state->flags);
1598 	return status;
1599 }
1600 
1601 static int nfs4_reclaim_open_state(struct nfs4_state_owner *sp, const struct nfs4_state_recovery_ops *ops)
1602 {
1603 	struct nfs4_state *state;
1604 	int status = 0;
1605 
1606 	/* Note: we rely on the sp->so_states list being ordered
1607 	 * so that we always reclaim open(O_RDWR) and/or open(O_WRITE)
1608 	 * states first.
1609 	 * This is needed to ensure that the server won't give us any
1610 	 * read delegations that we have to return if, say, we are
1611 	 * recovering after a network partition or a reboot from a
1612 	 * server that doesn't support a grace period.
1613 	 */
1614 	spin_lock(&sp->so_lock);
1615 	raw_write_seqcount_begin(&sp->so_reclaim_seqcount);
1616 restart:
1617 	list_for_each_entry(state, &sp->so_states, open_states) {
1618 		if (!test_and_clear_bit(ops->state_flag_bit, &state->flags))
1619 			continue;
1620 		if (!nfs4_valid_open_stateid(state))
1621 			continue;
1622 		if (state->state == 0)
1623 			continue;
1624 		refcount_inc(&state->count);
1625 		spin_unlock(&sp->so_lock);
1626 		status = __nfs4_reclaim_open_state(sp, state, ops);
1627 
1628 		switch (status) {
1629 		default:
1630 			if (status >= 0)
1631 				break;
1632 			printk(KERN_ERR "NFS: %s: unhandled error %d\n", __func__, status);
1633 			/* Fall through */
1634 		case -ENOENT:
1635 		case -ENOMEM:
1636 		case -EACCES:
1637 		case -EROFS:
1638 		case -EIO:
1639 		case -ESTALE:
1640 			/* Open state on this file cannot be recovered */
1641 			nfs4_state_mark_recovery_failed(state, status);
1642 			break;
1643 		case -EAGAIN:
1644 			ssleep(1);
1645 			/* Fall through */
1646 		case -NFS4ERR_ADMIN_REVOKED:
1647 		case -NFS4ERR_STALE_STATEID:
1648 		case -NFS4ERR_OLD_STATEID:
1649 		case -NFS4ERR_BAD_STATEID:
1650 		case -NFS4ERR_RECLAIM_BAD:
1651 		case -NFS4ERR_RECLAIM_CONFLICT:
1652 			nfs4_state_mark_reclaim_nograce(sp->so_server->nfs_client, state);
1653 			break;
1654 		case -NFS4ERR_EXPIRED:
1655 		case -NFS4ERR_NO_GRACE:
1656 			nfs4_state_mark_reclaim_nograce(sp->so_server->nfs_client, state);
1657 		case -NFS4ERR_STALE_CLIENTID:
1658 		case -NFS4ERR_BADSESSION:
1659 		case -NFS4ERR_BADSLOT:
1660 		case -NFS4ERR_BAD_HIGH_SLOT:
1661 		case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
1662 			goto out_err;
1663 		}
1664 		nfs4_put_open_state(state);
1665 		spin_lock(&sp->so_lock);
1666 		goto restart;
1667 	}
1668 	raw_write_seqcount_end(&sp->so_reclaim_seqcount);
1669 	spin_unlock(&sp->so_lock);
1670 	return 0;
1671 out_err:
1672 	nfs4_put_open_state(state);
1673 	spin_lock(&sp->so_lock);
1674 	raw_write_seqcount_end(&sp->so_reclaim_seqcount);
1675 	spin_unlock(&sp->so_lock);
1676 	return status;
1677 }
1678 
1679 static void nfs4_clear_open_state(struct nfs4_state *state)
1680 {
1681 	struct nfs4_lock_state *lock;
1682 
1683 	clear_bit(NFS_DELEGATED_STATE, &state->flags);
1684 	clear_bit(NFS_O_RDONLY_STATE, &state->flags);
1685 	clear_bit(NFS_O_WRONLY_STATE, &state->flags);
1686 	clear_bit(NFS_O_RDWR_STATE, &state->flags);
1687 	spin_lock(&state->state_lock);
1688 	list_for_each_entry(lock, &state->lock_states, ls_locks) {
1689 		lock->ls_seqid.flags = 0;
1690 		clear_bit(NFS_LOCK_INITIALIZED, &lock->ls_flags);
1691 	}
1692 	spin_unlock(&state->state_lock);
1693 }
1694 
1695 static void nfs4_reset_seqids(struct nfs_server *server,
1696 	int (*mark_reclaim)(struct nfs_client *clp, struct nfs4_state *state))
1697 {
1698 	struct nfs_client *clp = server->nfs_client;
1699 	struct nfs4_state_owner *sp;
1700 	struct rb_node *pos;
1701 	struct nfs4_state *state;
1702 
1703 	spin_lock(&clp->cl_lock);
1704 	for (pos = rb_first(&server->state_owners);
1705 	     pos != NULL;
1706 	     pos = rb_next(pos)) {
1707 		sp = rb_entry(pos, struct nfs4_state_owner, so_server_node);
1708 		sp->so_seqid.flags = 0;
1709 		spin_lock(&sp->so_lock);
1710 		list_for_each_entry(state, &sp->so_states, open_states) {
1711 			if (mark_reclaim(clp, state))
1712 				nfs4_clear_open_state(state);
1713 		}
1714 		spin_unlock(&sp->so_lock);
1715 	}
1716 	spin_unlock(&clp->cl_lock);
1717 }
1718 
1719 static void nfs4_state_mark_reclaim_helper(struct nfs_client *clp,
1720 	int (*mark_reclaim)(struct nfs_client *clp, struct nfs4_state *state))
1721 {
1722 	struct nfs_server *server;
1723 
1724 	rcu_read_lock();
1725 	list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
1726 		nfs4_reset_seqids(server, mark_reclaim);
1727 	rcu_read_unlock();
1728 }
1729 
1730 static void nfs4_state_start_reclaim_reboot(struct nfs_client *clp)
1731 {
1732 	/* Mark all delegations for reclaim */
1733 	nfs_delegation_mark_reclaim(clp);
1734 	nfs4_state_mark_reclaim_helper(clp, nfs4_state_mark_reclaim_reboot);
1735 }
1736 
1737 static int nfs4_reclaim_complete(struct nfs_client *clp,
1738 				 const struct nfs4_state_recovery_ops *ops,
1739 				 const struct cred *cred)
1740 {
1741 	/* Notify the server we're done reclaiming our state */
1742 	if (ops->reclaim_complete)
1743 		return ops->reclaim_complete(clp, cred);
1744 	return 0;
1745 }
1746 
1747 static void nfs4_clear_reclaim_server(struct nfs_server *server)
1748 {
1749 	struct nfs_client *clp = server->nfs_client;
1750 	struct nfs4_state_owner *sp;
1751 	struct rb_node *pos;
1752 	struct nfs4_state *state;
1753 
1754 	spin_lock(&clp->cl_lock);
1755 	for (pos = rb_first(&server->state_owners);
1756 	     pos != NULL;
1757 	     pos = rb_next(pos)) {
1758 		sp = rb_entry(pos, struct nfs4_state_owner, so_server_node);
1759 		spin_lock(&sp->so_lock);
1760 		list_for_each_entry(state, &sp->so_states, open_states) {
1761 			if (!test_and_clear_bit(NFS_STATE_RECLAIM_REBOOT,
1762 						&state->flags))
1763 				continue;
1764 			nfs4_state_mark_reclaim_nograce(clp, state);
1765 		}
1766 		spin_unlock(&sp->so_lock);
1767 	}
1768 	spin_unlock(&clp->cl_lock);
1769 }
1770 
1771 static int nfs4_state_clear_reclaim_reboot(struct nfs_client *clp)
1772 {
1773 	struct nfs_server *server;
1774 
1775 	if (!test_and_clear_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state))
1776 		return 0;
1777 
1778 	rcu_read_lock();
1779 	list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
1780 		nfs4_clear_reclaim_server(server);
1781 	rcu_read_unlock();
1782 
1783 	nfs_delegation_reap_unclaimed(clp);
1784 	return 1;
1785 }
1786 
1787 static void nfs4_state_end_reclaim_reboot(struct nfs_client *clp)
1788 {
1789 	const struct nfs4_state_recovery_ops *ops;
1790 	const struct cred *cred;
1791 	int err;
1792 
1793 	if (!nfs4_state_clear_reclaim_reboot(clp))
1794 		return;
1795 	ops = clp->cl_mvops->reboot_recovery_ops;
1796 	cred = nfs4_get_clid_cred(clp);
1797 	err = nfs4_reclaim_complete(clp, ops, cred);
1798 	put_cred(cred);
1799 	if (err == -NFS4ERR_CONN_NOT_BOUND_TO_SESSION)
1800 		set_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state);
1801 }
1802 
1803 static void nfs4_state_start_reclaim_nograce(struct nfs_client *clp)
1804 {
1805 	nfs_mark_test_expired_all_delegations(clp);
1806 	nfs4_state_mark_reclaim_helper(clp, nfs4_state_mark_reclaim_nograce);
1807 }
1808 
1809 static int nfs4_recovery_handle_error(struct nfs_client *clp, int error)
1810 {
1811 	switch (error) {
1812 	case 0:
1813 		break;
1814 	case -NFS4ERR_CB_PATH_DOWN:
1815 		nfs40_handle_cb_pathdown(clp);
1816 		break;
1817 	case -NFS4ERR_NO_GRACE:
1818 		nfs4_state_end_reclaim_reboot(clp);
1819 		break;
1820 	case -NFS4ERR_STALE_CLIENTID:
1821 		set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
1822 		nfs4_state_start_reclaim_reboot(clp);
1823 		break;
1824 	case -NFS4ERR_EXPIRED:
1825 		set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
1826 		nfs4_state_start_reclaim_nograce(clp);
1827 		break;
1828 	case -NFS4ERR_BADSESSION:
1829 	case -NFS4ERR_BADSLOT:
1830 	case -NFS4ERR_BAD_HIGH_SLOT:
1831 	case -NFS4ERR_DEADSESSION:
1832 	case -NFS4ERR_SEQ_FALSE_RETRY:
1833 	case -NFS4ERR_SEQ_MISORDERED:
1834 		set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state);
1835 		/* Zero session reset errors */
1836 		break;
1837 	case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
1838 		set_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state);
1839 		break;
1840 	default:
1841 		dprintk("%s: failed to handle error %d for server %s\n",
1842 				__func__, error, clp->cl_hostname);
1843 		return error;
1844 	}
1845 	dprintk("%s: handled error %d for server %s\n", __func__, error,
1846 			clp->cl_hostname);
1847 	return 0;
1848 }
1849 
1850 static int nfs4_do_reclaim(struct nfs_client *clp, const struct nfs4_state_recovery_ops *ops)
1851 {
1852 	struct nfs4_state_owner *sp;
1853 	struct nfs_server *server;
1854 	struct rb_node *pos;
1855 	int status = 0;
1856 
1857 restart:
1858 	rcu_read_lock();
1859 	list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
1860 		nfs4_purge_state_owners(server);
1861 		spin_lock(&clp->cl_lock);
1862 		for (pos = rb_first(&server->state_owners);
1863 		     pos != NULL;
1864 		     pos = rb_next(pos)) {
1865 			sp = rb_entry(pos,
1866 				struct nfs4_state_owner, so_server_node);
1867 			if (!test_and_clear_bit(ops->owner_flag_bit,
1868 							&sp->so_flags))
1869 				continue;
1870 			if (!atomic_inc_not_zero(&sp->so_count))
1871 				continue;
1872 			spin_unlock(&clp->cl_lock);
1873 			rcu_read_unlock();
1874 
1875 			status = nfs4_reclaim_open_state(sp, ops);
1876 			if (status < 0) {
1877 				set_bit(ops->owner_flag_bit, &sp->so_flags);
1878 				nfs4_put_state_owner(sp);
1879 				status = nfs4_recovery_handle_error(clp, status);
1880 				return (status != 0) ? status : -EAGAIN;
1881 			}
1882 
1883 			nfs4_put_state_owner(sp);
1884 			goto restart;
1885 		}
1886 		spin_unlock(&clp->cl_lock);
1887 	}
1888 	rcu_read_unlock();
1889 	return 0;
1890 }
1891 
1892 static int nfs4_check_lease(struct nfs_client *clp)
1893 {
1894 	const struct cred *cred;
1895 	const struct nfs4_state_maintenance_ops *ops =
1896 		clp->cl_mvops->state_renewal_ops;
1897 	int status;
1898 
1899 	/* Is the client already known to have an expired lease? */
1900 	if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state))
1901 		return 0;
1902 	cred = ops->get_state_renewal_cred(clp);
1903 	if (cred == NULL) {
1904 		cred = nfs4_get_clid_cred(clp);
1905 		status = -ENOKEY;
1906 		if (cred == NULL)
1907 			goto out;
1908 	}
1909 	status = ops->renew_lease(clp, cred);
1910 	put_cred(cred);
1911 	if (status == -ETIMEDOUT) {
1912 		set_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state);
1913 		return 0;
1914 	}
1915 out:
1916 	return nfs4_recovery_handle_error(clp, status);
1917 }
1918 
1919 /* Set NFS4CLNT_LEASE_EXPIRED and reclaim reboot state for all v4.0 errors
1920  * and for recoverable errors on EXCHANGE_ID for v4.1
1921  */
1922 static int nfs4_handle_reclaim_lease_error(struct nfs_client *clp, int status)
1923 {
1924 	switch (status) {
1925 	case -NFS4ERR_SEQ_MISORDERED:
1926 		if (test_and_set_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state))
1927 			return -ESERVERFAULT;
1928 		/* Lease confirmation error: retry after purging the lease */
1929 		ssleep(1);
1930 		clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
1931 		break;
1932 	case -NFS4ERR_STALE_CLIENTID:
1933 		clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
1934 		nfs4_state_start_reclaim_reboot(clp);
1935 		break;
1936 	case -NFS4ERR_CLID_INUSE:
1937 		pr_err("NFS: Server %s reports our clientid is in use\n",
1938 			clp->cl_hostname);
1939 		nfs_mark_client_ready(clp, -EPERM);
1940 		clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
1941 		return -EPERM;
1942 	case -EACCES:
1943 	case -NFS4ERR_DELAY:
1944 	case -ETIMEDOUT:
1945 	case -EAGAIN:
1946 		ssleep(1);
1947 		break;
1948 
1949 	case -NFS4ERR_MINOR_VERS_MISMATCH:
1950 		if (clp->cl_cons_state == NFS_CS_SESSION_INITING)
1951 			nfs_mark_client_ready(clp, -EPROTONOSUPPORT);
1952 		dprintk("%s: exit with error %d for server %s\n",
1953 				__func__, -EPROTONOSUPPORT, clp->cl_hostname);
1954 		return -EPROTONOSUPPORT;
1955 	case -NFS4ERR_NOT_SAME: /* FixMe: implement recovery
1956 				 * in nfs4_exchange_id */
1957 	default:
1958 		dprintk("%s: exit with error %d for server %s\n", __func__,
1959 				status, clp->cl_hostname);
1960 		return status;
1961 	}
1962 	set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
1963 	dprintk("%s: handled error %d for server %s\n", __func__, status,
1964 			clp->cl_hostname);
1965 	return 0;
1966 }
1967 
1968 static int nfs4_establish_lease(struct nfs_client *clp)
1969 {
1970 	const struct cred *cred;
1971 	const struct nfs4_state_recovery_ops *ops =
1972 		clp->cl_mvops->reboot_recovery_ops;
1973 	int status;
1974 
1975 	status = nfs4_begin_drain_session(clp);
1976 	if (status != 0)
1977 		return status;
1978 	cred = nfs4_get_clid_cred(clp);
1979 	if (cred == NULL)
1980 		return -ENOENT;
1981 	status = ops->establish_clid(clp, cred);
1982 	put_cred(cred);
1983 	if (status != 0)
1984 		return status;
1985 	pnfs_destroy_all_layouts(clp);
1986 	return 0;
1987 }
1988 
1989 /*
1990  * Returns zero or a negative errno.  NFS4ERR values are converted
1991  * to local errno values.
1992  */
1993 static int nfs4_reclaim_lease(struct nfs_client *clp)
1994 {
1995 	int status;
1996 
1997 	status = nfs4_establish_lease(clp);
1998 	if (status < 0)
1999 		return nfs4_handle_reclaim_lease_error(clp, status);
2000 	if (test_and_clear_bit(NFS4CLNT_SERVER_SCOPE_MISMATCH, &clp->cl_state))
2001 		nfs4_state_start_reclaim_nograce(clp);
2002 	if (!test_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state))
2003 		set_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state);
2004 	clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state);
2005 	clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
2006 	return 0;
2007 }
2008 
2009 static int nfs4_purge_lease(struct nfs_client *clp)
2010 {
2011 	int status;
2012 
2013 	status = nfs4_establish_lease(clp);
2014 	if (status < 0)
2015 		return nfs4_handle_reclaim_lease_error(clp, status);
2016 	clear_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state);
2017 	set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
2018 	nfs4_state_start_reclaim_nograce(clp);
2019 	return 0;
2020 }
2021 
2022 /*
2023  * Try remote migration of one FSID from a source server to a
2024  * destination server.  The source server provides a list of
2025  * potential destinations.
2026  *
2027  * Returns zero or a negative NFS4ERR status code.
2028  */
2029 static int nfs4_try_migration(struct nfs_server *server, const struct cred *cred)
2030 {
2031 	struct nfs_client *clp = server->nfs_client;
2032 	struct nfs4_fs_locations *locations = NULL;
2033 	struct inode *inode;
2034 	struct page *page;
2035 	int status, result;
2036 
2037 	dprintk("--> %s: FSID %llx:%llx on \"%s\"\n", __func__,
2038 			(unsigned long long)server->fsid.major,
2039 			(unsigned long long)server->fsid.minor,
2040 			clp->cl_hostname);
2041 
2042 	result = 0;
2043 	page = alloc_page(GFP_KERNEL);
2044 	locations = kmalloc(sizeof(struct nfs4_fs_locations), GFP_KERNEL);
2045 	if (page == NULL || locations == NULL) {
2046 		dprintk("<-- %s: no memory\n", __func__);
2047 		goto out;
2048 	}
2049 
2050 	inode = d_inode(server->super->s_root);
2051 	result = nfs4_proc_get_locations(inode, locations, page, cred);
2052 	if (result) {
2053 		dprintk("<-- %s: failed to retrieve fs_locations: %d\n",
2054 			__func__, result);
2055 		goto out;
2056 	}
2057 
2058 	result = -NFS4ERR_NXIO;
2059 	if (!(locations->fattr.valid & NFS_ATTR_FATTR_V4_LOCATIONS)) {
2060 		dprintk("<-- %s: No fs_locations data, migration skipped\n",
2061 			__func__);
2062 		goto out;
2063 	}
2064 
2065 	status = nfs4_begin_drain_session(clp);
2066 	if (status != 0)
2067 		return status;
2068 
2069 	status = nfs4_replace_transport(server, locations);
2070 	if (status != 0) {
2071 		dprintk("<-- %s: failed to replace transport: %d\n",
2072 			__func__, status);
2073 		goto out;
2074 	}
2075 
2076 	result = 0;
2077 	dprintk("<-- %s: migration succeeded\n", __func__);
2078 
2079 out:
2080 	if (page != NULL)
2081 		__free_page(page);
2082 	kfree(locations);
2083 	if (result) {
2084 		pr_err("NFS: migration recovery failed (server %s)\n",
2085 				clp->cl_hostname);
2086 		set_bit(NFS_MIG_FAILED, &server->mig_status);
2087 	}
2088 	return result;
2089 }
2090 
2091 /*
2092  * Returns zero or a negative NFS4ERR status code.
2093  */
2094 static int nfs4_handle_migration(struct nfs_client *clp)
2095 {
2096 	const struct nfs4_state_maintenance_ops *ops =
2097 				clp->cl_mvops->state_renewal_ops;
2098 	struct nfs_server *server;
2099 	const struct cred *cred;
2100 
2101 	dprintk("%s: migration reported on \"%s\"\n", __func__,
2102 			clp->cl_hostname);
2103 
2104 	cred = ops->get_state_renewal_cred(clp);
2105 	if (cred == NULL)
2106 		return -NFS4ERR_NOENT;
2107 
2108 	clp->cl_mig_gen++;
2109 restart:
2110 	rcu_read_lock();
2111 	list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
2112 		int status;
2113 
2114 		if (server->mig_gen == clp->cl_mig_gen)
2115 			continue;
2116 		server->mig_gen = clp->cl_mig_gen;
2117 
2118 		if (!test_and_clear_bit(NFS_MIG_IN_TRANSITION,
2119 						&server->mig_status))
2120 			continue;
2121 
2122 		rcu_read_unlock();
2123 		status = nfs4_try_migration(server, cred);
2124 		if (status < 0) {
2125 			put_cred(cred);
2126 			return status;
2127 		}
2128 		goto restart;
2129 	}
2130 	rcu_read_unlock();
2131 	put_cred(cred);
2132 	return 0;
2133 }
2134 
2135 /*
2136  * Test each nfs_server on the clp's cl_superblocks list to see
2137  * if it's moved to another server.  Stop when the server no longer
2138  * returns NFS4ERR_LEASE_MOVED.
2139  */
2140 static int nfs4_handle_lease_moved(struct nfs_client *clp)
2141 {
2142 	const struct nfs4_state_maintenance_ops *ops =
2143 				clp->cl_mvops->state_renewal_ops;
2144 	struct nfs_server *server;
2145 	const struct cred *cred;
2146 
2147 	dprintk("%s: lease moved reported on \"%s\"\n", __func__,
2148 			clp->cl_hostname);
2149 
2150 	cred = ops->get_state_renewal_cred(clp);
2151 	if (cred == NULL)
2152 		return -NFS4ERR_NOENT;
2153 
2154 	clp->cl_mig_gen++;
2155 restart:
2156 	rcu_read_lock();
2157 	list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
2158 		struct inode *inode;
2159 		int status;
2160 
2161 		if (server->mig_gen == clp->cl_mig_gen)
2162 			continue;
2163 		server->mig_gen = clp->cl_mig_gen;
2164 
2165 		rcu_read_unlock();
2166 
2167 		inode = d_inode(server->super->s_root);
2168 		status = nfs4_proc_fsid_present(inode, cred);
2169 		if (status != -NFS4ERR_MOVED)
2170 			goto restart;	/* wasn't this one */
2171 		if (nfs4_try_migration(server, cred) == -NFS4ERR_LEASE_MOVED)
2172 			goto restart;	/* there are more */
2173 		goto out;
2174 	}
2175 	rcu_read_unlock();
2176 
2177 out:
2178 	put_cred(cred);
2179 	return 0;
2180 }
2181 
2182 /**
2183  * nfs4_discover_server_trunking - Detect server IP address trunking
2184  *
2185  * @clp: nfs_client under test
2186  * @result: OUT: found nfs_client, or clp
2187  *
2188  * Returns zero or a negative errno.  If zero is returned,
2189  * an nfs_client pointer is planted in "result".
2190  *
2191  * Note: since we are invoked in process context, and
2192  * not from inside the state manager, we cannot use
2193  * nfs4_handle_reclaim_lease_error().
2194  */
2195 int nfs4_discover_server_trunking(struct nfs_client *clp,
2196 				  struct nfs_client **result)
2197 {
2198 	const struct nfs4_state_recovery_ops *ops =
2199 				clp->cl_mvops->reboot_recovery_ops;
2200 	struct rpc_clnt *clnt;
2201 	const struct cred *cred;
2202 	int i, status;
2203 
2204 	dprintk("NFS: %s: testing '%s'\n", __func__, clp->cl_hostname);
2205 
2206 	clnt = clp->cl_rpcclient;
2207 	i = 0;
2208 
2209 	mutex_lock(&nfs_clid_init_mutex);
2210 again:
2211 	status  = -ENOENT;
2212 	cred = nfs4_get_clid_cred(clp);
2213 	if (cred == NULL)
2214 		goto out_unlock;
2215 
2216 	status = ops->detect_trunking(clp, result, cred);
2217 	put_cred(cred);
2218 	switch (status) {
2219 	case 0:
2220 	case -EINTR:
2221 	case -ERESTARTSYS:
2222 		break;
2223 	case -ETIMEDOUT:
2224 		if (clnt->cl_softrtry)
2225 			break;
2226 		/* Fall through */
2227 	case -NFS4ERR_DELAY:
2228 	case -EAGAIN:
2229 		ssleep(1);
2230 		/* Fall through */
2231 	case -NFS4ERR_STALE_CLIENTID:
2232 		dprintk("NFS: %s after status %d, retrying\n",
2233 			__func__, status);
2234 		goto again;
2235 	case -EACCES:
2236 		if (i++ == 0) {
2237 			nfs4_root_machine_cred(clp);
2238 			goto again;
2239 		}
2240 		if (clnt->cl_auth->au_flavor == RPC_AUTH_UNIX)
2241 			break;
2242 		/* Fall through */
2243 	case -NFS4ERR_CLID_INUSE:
2244 	case -NFS4ERR_WRONGSEC:
2245 		/* No point in retrying if we already used RPC_AUTH_UNIX */
2246 		if (clnt->cl_auth->au_flavor == RPC_AUTH_UNIX) {
2247 			status = -EPERM;
2248 			break;
2249 		}
2250 		clnt = rpc_clone_client_set_auth(clnt, RPC_AUTH_UNIX);
2251 		if (IS_ERR(clnt)) {
2252 			status = PTR_ERR(clnt);
2253 			break;
2254 		}
2255 		/* Note: this is safe because we haven't yet marked the
2256 		 * client as ready, so we are the only user of
2257 		 * clp->cl_rpcclient
2258 		 */
2259 		clnt = xchg(&clp->cl_rpcclient, clnt);
2260 		rpc_shutdown_client(clnt);
2261 		clnt = clp->cl_rpcclient;
2262 		goto again;
2263 
2264 	case -NFS4ERR_MINOR_VERS_MISMATCH:
2265 		status = -EPROTONOSUPPORT;
2266 		break;
2267 
2268 	case -EKEYEXPIRED:
2269 	case -NFS4ERR_NOT_SAME: /* FixMe: implement recovery
2270 				 * in nfs4_exchange_id */
2271 		status = -EKEYEXPIRED;
2272 		break;
2273 	default:
2274 		pr_warn("NFS: %s unhandled error %d. Exiting with error EIO\n",
2275 				__func__, status);
2276 		status = -EIO;
2277 	}
2278 
2279 out_unlock:
2280 	mutex_unlock(&nfs_clid_init_mutex);
2281 	dprintk("NFS: %s: status = %d\n", __func__, status);
2282 	return status;
2283 }
2284 
2285 #ifdef CONFIG_NFS_V4_1
2286 void nfs4_schedule_session_recovery(struct nfs4_session *session, int err)
2287 {
2288 	struct nfs_client *clp = session->clp;
2289 
2290 	switch (err) {
2291 	default:
2292 		set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state);
2293 		break;
2294 	case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
2295 		set_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state);
2296 	}
2297 	nfs4_schedule_state_manager(clp);
2298 }
2299 EXPORT_SYMBOL_GPL(nfs4_schedule_session_recovery);
2300 
2301 void nfs41_notify_server(struct nfs_client *clp)
2302 {
2303 	/* Use CHECK_LEASE to ping the server with a SEQUENCE */
2304 	set_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state);
2305 	nfs4_schedule_state_manager(clp);
2306 }
2307 
2308 static void nfs4_reset_all_state(struct nfs_client *clp)
2309 {
2310 	if (test_and_set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) == 0) {
2311 		set_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state);
2312 		clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
2313 		nfs4_state_start_reclaim_nograce(clp);
2314 		dprintk("%s: scheduling reset of all state for server %s!\n",
2315 				__func__, clp->cl_hostname);
2316 		nfs4_schedule_state_manager(clp);
2317 	}
2318 }
2319 
2320 static void nfs41_handle_server_reboot(struct nfs_client *clp)
2321 {
2322 	if (test_and_set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) == 0) {
2323 		nfs4_state_start_reclaim_reboot(clp);
2324 		dprintk("%s: server %s rebooted!\n", __func__,
2325 				clp->cl_hostname);
2326 		nfs4_schedule_state_manager(clp);
2327 	}
2328 }
2329 
2330 static void nfs41_handle_all_state_revoked(struct nfs_client *clp)
2331 {
2332 	nfs4_reset_all_state(clp);
2333 	dprintk("%s: state revoked on server %s\n", __func__, clp->cl_hostname);
2334 }
2335 
2336 static void nfs41_handle_some_state_revoked(struct nfs_client *clp)
2337 {
2338 	nfs4_state_start_reclaim_nograce(clp);
2339 	nfs4_schedule_state_manager(clp);
2340 
2341 	dprintk("%s: state revoked on server %s\n", __func__, clp->cl_hostname);
2342 }
2343 
2344 static void nfs41_handle_recallable_state_revoked(struct nfs_client *clp)
2345 {
2346 	/* FIXME: For now, we destroy all layouts. */
2347 	pnfs_destroy_all_layouts(clp);
2348 	/* FIXME: For now, we test all delegations+open state+locks. */
2349 	nfs41_handle_some_state_revoked(clp);
2350 	dprintk("%s: Recallable state revoked on server %s!\n", __func__,
2351 			clp->cl_hostname);
2352 }
2353 
2354 static void nfs41_handle_backchannel_fault(struct nfs_client *clp)
2355 {
2356 	set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state);
2357 	nfs4_schedule_state_manager(clp);
2358 
2359 	dprintk("%s: server %s declared a backchannel fault\n", __func__,
2360 			clp->cl_hostname);
2361 }
2362 
2363 static void nfs41_handle_cb_path_down(struct nfs_client *clp)
2364 {
2365 	if (test_and_set_bit(NFS4CLNT_BIND_CONN_TO_SESSION,
2366 		&clp->cl_state) == 0)
2367 		nfs4_schedule_state_manager(clp);
2368 }
2369 
2370 void nfs41_handle_sequence_flag_errors(struct nfs_client *clp, u32 flags,
2371 		bool recovery)
2372 {
2373 	if (!flags)
2374 		return;
2375 
2376 	dprintk("%s: \"%s\" (client ID %llx) flags=0x%08x\n",
2377 		__func__, clp->cl_hostname, clp->cl_clientid, flags);
2378 	/*
2379 	 * If we're called from the state manager thread, then assume we're
2380 	 * already handling the RECLAIM_NEEDED and/or STATE_REVOKED.
2381 	 * Those flags are expected to remain set until we're done
2382 	 * recovering (see RFC5661, section 18.46.3).
2383 	 */
2384 	if (recovery)
2385 		goto out_recovery;
2386 
2387 	if (flags & SEQ4_STATUS_RESTART_RECLAIM_NEEDED)
2388 		nfs41_handle_server_reboot(clp);
2389 	if (flags & (SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED))
2390 		nfs41_handle_all_state_revoked(clp);
2391 	if (flags & (SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED |
2392 			    SEQ4_STATUS_ADMIN_STATE_REVOKED))
2393 		nfs41_handle_some_state_revoked(clp);
2394 	if (flags & SEQ4_STATUS_LEASE_MOVED)
2395 		nfs4_schedule_lease_moved_recovery(clp);
2396 	if (flags & SEQ4_STATUS_RECALLABLE_STATE_REVOKED)
2397 		nfs41_handle_recallable_state_revoked(clp);
2398 out_recovery:
2399 	if (flags & SEQ4_STATUS_BACKCHANNEL_FAULT)
2400 		nfs41_handle_backchannel_fault(clp);
2401 	else if (flags & (SEQ4_STATUS_CB_PATH_DOWN |
2402 				SEQ4_STATUS_CB_PATH_DOWN_SESSION))
2403 		nfs41_handle_cb_path_down(clp);
2404 }
2405 
2406 static int nfs4_reset_session(struct nfs_client *clp)
2407 {
2408 	const struct cred *cred;
2409 	int status;
2410 
2411 	if (!nfs4_has_session(clp))
2412 		return 0;
2413 	status = nfs4_begin_drain_session(clp);
2414 	if (status != 0)
2415 		return status;
2416 	cred = nfs4_get_clid_cred(clp);
2417 	status = nfs4_proc_destroy_session(clp->cl_session, cred);
2418 	switch (status) {
2419 	case 0:
2420 	case -NFS4ERR_BADSESSION:
2421 	case -NFS4ERR_DEADSESSION:
2422 		break;
2423 	case -NFS4ERR_BACK_CHAN_BUSY:
2424 	case -NFS4ERR_DELAY:
2425 		set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state);
2426 		status = 0;
2427 		ssleep(1);
2428 		goto out;
2429 	default:
2430 		status = nfs4_recovery_handle_error(clp, status);
2431 		goto out;
2432 	}
2433 
2434 	memset(clp->cl_session->sess_id.data, 0, NFS4_MAX_SESSIONID_LEN);
2435 	status = nfs4_proc_create_session(clp, cred);
2436 	if (status) {
2437 		dprintk("%s: session reset failed with status %d for server %s!\n",
2438 			__func__, status, clp->cl_hostname);
2439 		status = nfs4_handle_reclaim_lease_error(clp, status);
2440 		goto out;
2441 	}
2442 	nfs41_finish_session_reset(clp);
2443 	dprintk("%s: session reset was successful for server %s!\n",
2444 			__func__, clp->cl_hostname);
2445 out:
2446 	put_cred(cred);
2447 	return status;
2448 }
2449 
2450 static int nfs4_bind_conn_to_session(struct nfs_client *clp)
2451 {
2452 	const struct cred *cred;
2453 	int ret;
2454 
2455 	if (!nfs4_has_session(clp))
2456 		return 0;
2457 	ret = nfs4_begin_drain_session(clp);
2458 	if (ret != 0)
2459 		return ret;
2460 	cred = nfs4_get_clid_cred(clp);
2461 	ret = nfs4_proc_bind_conn_to_session(clp, cred);
2462 	put_cred(cred);
2463 	clear_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state);
2464 	switch (ret) {
2465 	case 0:
2466 		dprintk("%s: bind_conn_to_session was successful for server %s!\n",
2467 			__func__, clp->cl_hostname);
2468 		break;
2469 	case -NFS4ERR_DELAY:
2470 		ssleep(1);
2471 		set_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state);
2472 		break;
2473 	default:
2474 		return nfs4_recovery_handle_error(clp, ret);
2475 	}
2476 	return 0;
2477 }
2478 #else /* CONFIG_NFS_V4_1 */
2479 static int nfs4_reset_session(struct nfs_client *clp) { return 0; }
2480 
2481 static int nfs4_bind_conn_to_session(struct nfs_client *clp)
2482 {
2483 	return 0;
2484 }
2485 #endif /* CONFIG_NFS_V4_1 */
2486 
2487 static void nfs4_state_manager(struct nfs_client *clp)
2488 {
2489 	int status = 0;
2490 	const char *section = "", *section_sep = "";
2491 
2492 	/* Ensure exclusive access to NFSv4 state */
2493 	do {
2494 		clear_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state);
2495 		if (test_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state)) {
2496 			section = "purge state";
2497 			status = nfs4_purge_lease(clp);
2498 			if (status < 0)
2499 				goto out_error;
2500 			continue;
2501 		}
2502 
2503 		if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) {
2504 			section = "lease expired";
2505 			/* We're going to have to re-establish a clientid */
2506 			status = nfs4_reclaim_lease(clp);
2507 			if (status < 0)
2508 				goto out_error;
2509 			continue;
2510 		}
2511 
2512 		/* Initialize or reset the session */
2513 		if (test_and_clear_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state)) {
2514 			section = "reset session";
2515 			status = nfs4_reset_session(clp);
2516 			if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state))
2517 				continue;
2518 			if (status < 0)
2519 				goto out_error;
2520 		}
2521 
2522 		/* Send BIND_CONN_TO_SESSION */
2523 		if (test_and_clear_bit(NFS4CLNT_BIND_CONN_TO_SESSION,
2524 				&clp->cl_state)) {
2525 			section = "bind conn to session";
2526 			status = nfs4_bind_conn_to_session(clp);
2527 			if (status < 0)
2528 				goto out_error;
2529 			continue;
2530 		}
2531 
2532 		if (test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
2533 			section = "check lease";
2534 			status = nfs4_check_lease(clp);
2535 			if (status < 0)
2536 				goto out_error;
2537 			continue;
2538 		}
2539 
2540 		if (test_and_clear_bit(NFS4CLNT_MOVED, &clp->cl_state)) {
2541 			section = "migration";
2542 			status = nfs4_handle_migration(clp);
2543 			if (status < 0)
2544 				goto out_error;
2545 		}
2546 
2547 		if (test_and_clear_bit(NFS4CLNT_LEASE_MOVED, &clp->cl_state)) {
2548 			section = "lease moved";
2549 			status = nfs4_handle_lease_moved(clp);
2550 			if (status < 0)
2551 				goto out_error;
2552 		}
2553 
2554 		/* First recover reboot state... */
2555 		if (test_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state)) {
2556 			section = "reclaim reboot";
2557 			status = nfs4_do_reclaim(clp,
2558 				clp->cl_mvops->reboot_recovery_ops);
2559 			if (status == -EAGAIN)
2560 				continue;
2561 			if (status < 0)
2562 				goto out_error;
2563 			nfs4_state_end_reclaim_reboot(clp);
2564 		}
2565 
2566 		/* Detect expired delegations... */
2567 		if (test_and_clear_bit(NFS4CLNT_DELEGATION_EXPIRED, &clp->cl_state)) {
2568 			section = "detect expired delegations";
2569 			nfs_reap_expired_delegations(clp);
2570 			continue;
2571 		}
2572 
2573 		/* Now recover expired state... */
2574 		if (test_and_clear_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state)) {
2575 			section = "reclaim nograce";
2576 			status = nfs4_do_reclaim(clp,
2577 				clp->cl_mvops->nograce_recovery_ops);
2578 			if (status == -EAGAIN)
2579 				continue;
2580 			if (status < 0)
2581 				goto out_error;
2582 		}
2583 
2584 		nfs4_end_drain_session(clp);
2585 		nfs4_clear_state_manager_bit(clp);
2586 
2587 		if (!test_and_set_bit(NFS4CLNT_DELEGRETURN_RUNNING, &clp->cl_state)) {
2588 			if (test_and_clear_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state)) {
2589 				nfs_client_return_marked_delegations(clp);
2590 				set_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state);
2591 			}
2592 			clear_bit(NFS4CLNT_DELEGRETURN_RUNNING, &clp->cl_state);
2593 		}
2594 
2595 		/* Did we race with an attempt to give us more work? */
2596 		if (!test_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state))
2597 			return;
2598 		if (test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) != 0)
2599 			return;
2600 	} while (refcount_read(&clp->cl_count) > 1 && !signalled());
2601 	goto out_drain;
2602 
2603 out_error:
2604 	if (strlen(section))
2605 		section_sep = ": ";
2606 	pr_warn_ratelimited("NFS: state manager%s%s failed on NFSv4 server %s"
2607 			" with error %d\n", section_sep, section,
2608 			clp->cl_hostname, -status);
2609 	ssleep(1);
2610 out_drain:
2611 	nfs4_end_drain_session(clp);
2612 	nfs4_clear_state_manager_bit(clp);
2613 }
2614 
2615 static int nfs4_run_state_manager(void *ptr)
2616 {
2617 	struct nfs_client *clp = ptr;
2618 
2619 	allow_signal(SIGKILL);
2620 	nfs4_state_manager(clp);
2621 	nfs_put_client(clp);
2622 	module_put_and_exit(0);
2623 	return 0;
2624 }
2625 
2626 /*
2627  * Local variables:
2628  *  c-basic-offset: 8
2629  * End:
2630  */
2631