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