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