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