Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gerg/m68knommu
[firefly-linux-kernel-4.4.55.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/nfs_idmap.h>
46 #include <linux/kthread.h>
47 #include <linux/module.h>
48 #include <linux/random.h>
49 #include <linux/ratelimit.h>
50 #include <linux/workqueue.h>
51 #include <linux/bitops.h>
52 #include <linux/jiffies.h>
53
54 #include <linux/sunrpc/clnt.h>
55
56 #include "nfs4_fs.h"
57 #include "callback.h"
58 #include "delegation.h"
59 #include "internal.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 static DEFINE_MUTEX(nfs_clid_init_mutex);
70
71 int nfs4_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
72 {
73         struct nfs4_setclientid_res clid = {
74                 .clientid = clp->cl_clientid,
75                 .confirm = clp->cl_confirm,
76         };
77         unsigned short port;
78         int status;
79         struct nfs_net *nn = net_generic(clp->cl_net, nfs_net_id);
80
81         if (test_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state))
82                 goto do_confirm;
83         port = nn->nfs_callback_tcpport;
84         if (clp->cl_addr.ss_family == AF_INET6)
85                 port = nn->nfs_callback_tcpport6;
86
87         status = nfs4_proc_setclientid(clp, NFS4_CALLBACK, port, cred, &clid);
88         if (status != 0)
89                 goto out;
90         clp->cl_clientid = clid.clientid;
91         clp->cl_confirm = clid.confirm;
92         set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
93 do_confirm:
94         status = nfs4_proc_setclientid_confirm(clp, &clid, cred);
95         if (status != 0)
96                 goto out;
97         clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
98         nfs4_schedule_state_renewal(clp);
99 out:
100         return status;
101 }
102
103 /**
104  * nfs40_discover_server_trunking - Detect server IP address trunking (mv0)
105  *
106  * @clp: nfs_client under test
107  * @result: OUT: found nfs_client, or clp
108  * @cred: credential to use for trunking test
109  *
110  * Returns zero, a negative errno, or a negative NFS4ERR status.
111  * If zero is returned, an nfs_client pointer is planted in
112  * "result".
113  *
114  * Note: The returned client may not yet be marked ready.
115  */
116 int nfs40_discover_server_trunking(struct nfs_client *clp,
117                                    struct nfs_client **result,
118                                    struct rpc_cred *cred)
119 {
120         struct nfs4_setclientid_res clid = {
121                 .clientid = clp->cl_clientid,
122                 .confirm = clp->cl_confirm,
123         };
124         struct nfs_net *nn = net_generic(clp->cl_net, nfs_net_id);
125         unsigned short port;
126         int status;
127
128         port = nn->nfs_callback_tcpport;
129         if (clp->cl_addr.ss_family == AF_INET6)
130                 port = nn->nfs_callback_tcpport6;
131
132         status = nfs4_proc_setclientid(clp, NFS4_CALLBACK, port, cred, &clid);
133         if (status != 0)
134                 goto out;
135         clp->cl_clientid = clid.clientid;
136         clp->cl_confirm = clid.confirm;
137
138         status = nfs40_walk_client_list(clp, result, cred);
139         if (status == 0) {
140                 /* Sustain the lease, even if it's empty.  If the clientid4
141                  * goes stale it's of no use for trunking discovery. */
142                 nfs4_schedule_state_renewal(*result);
143         }
144 out:
145         return status;
146 }
147
148 struct rpc_cred *nfs4_get_machine_cred_locked(struct nfs_client *clp)
149 {
150         struct rpc_cred *cred = NULL;
151
152         if (clp->cl_machine_cred != NULL)
153                 cred = get_rpccred(clp->cl_machine_cred);
154         return cred;
155 }
156
157 static struct rpc_cred *
158 nfs4_get_renew_cred_server_locked(struct nfs_server *server)
159 {
160         struct rpc_cred *cred = NULL;
161         struct nfs4_state_owner *sp;
162         struct rb_node *pos;
163
164         for (pos = rb_first(&server->state_owners);
165              pos != NULL;
166              pos = rb_next(pos)) {
167                 sp = rb_entry(pos, struct nfs4_state_owner, so_server_node);
168                 if (list_empty(&sp->so_states))
169                         continue;
170                 cred = get_rpccred(sp->so_cred);
171                 break;
172         }
173         return cred;
174 }
175
176 /**
177  * nfs4_get_renew_cred_locked - Acquire credential for a renew operation
178  * @clp: client state handle
179  *
180  * Returns an rpc_cred with reference count bumped, or NULL.
181  * Caller must hold clp->cl_lock.
182  */
183 struct rpc_cred *nfs4_get_renew_cred_locked(struct nfs_client *clp)
184 {
185         struct rpc_cred *cred = NULL;
186         struct nfs_server *server;
187
188         /* Use machine credentials if available */
189         cred = nfs4_get_machine_cred_locked(clp);
190         if (cred != NULL)
191                 goto out;
192
193         rcu_read_lock();
194         list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
195                 cred = nfs4_get_renew_cred_server_locked(server);
196                 if (cred != NULL)
197                         break;
198         }
199         rcu_read_unlock();
200
201 out:
202         return cred;
203 }
204
205 #if defined(CONFIG_NFS_V4_1)
206
207 static int nfs41_setup_state_renewal(struct nfs_client *clp)
208 {
209         int status;
210         struct nfs_fsinfo fsinfo;
211
212         if (!test_bit(NFS_CS_CHECK_LEASE_TIME, &clp->cl_res_state)) {
213                 nfs4_schedule_state_renewal(clp);
214                 return 0;
215         }
216
217         status = nfs4_proc_get_lease_time(clp, &fsinfo);
218         if (status == 0) {
219                 /* Update lease time and schedule renewal */
220                 spin_lock(&clp->cl_lock);
221                 clp->cl_lease_time = fsinfo.lease_time * HZ;
222                 clp->cl_last_renewal = jiffies;
223                 spin_unlock(&clp->cl_lock);
224
225                 nfs4_schedule_state_renewal(clp);
226         }
227
228         return status;
229 }
230
231 /*
232  * Back channel returns NFS4ERR_DELAY for new requests when
233  * NFS4_SESSION_DRAINING is set so there is no work to be done when draining
234  * is ended.
235  */
236 static void nfs4_end_drain_session(struct nfs_client *clp)
237 {
238         struct nfs4_session *ses = clp->cl_session;
239         struct nfs4_slot_table *tbl;
240
241         if (ses == NULL)
242                 return;
243         tbl = &ses->fc_slot_table;
244         if (test_and_clear_bit(NFS4_SESSION_DRAINING, &ses->session_state)) {
245                 spin_lock(&tbl->slot_tbl_lock);
246                 nfs41_wake_slot_table(tbl);
247                 spin_unlock(&tbl->slot_tbl_lock);
248         }
249 }
250
251 /*
252  * Signal state manager thread if session fore channel is drained
253  */
254 void nfs4_session_drain_complete(struct nfs4_session *session,
255                 struct nfs4_slot_table *tbl)
256 {
257         if (nfs4_session_draining(session))
258                 complete(&tbl->complete);
259 }
260
261 static int nfs4_wait_on_slot_tbl(struct nfs4_slot_table *tbl)
262 {
263         spin_lock(&tbl->slot_tbl_lock);
264         if (tbl->highest_used_slotid != NFS4_NO_SLOT) {
265                 INIT_COMPLETION(tbl->complete);
266                 spin_unlock(&tbl->slot_tbl_lock);
267                 return wait_for_completion_interruptible(&tbl->complete);
268         }
269         spin_unlock(&tbl->slot_tbl_lock);
270         return 0;
271 }
272
273 static int nfs4_begin_drain_session(struct nfs_client *clp)
274 {
275         struct nfs4_session *ses = clp->cl_session;
276         int ret = 0;
277
278         set_bit(NFS4_SESSION_DRAINING, &ses->session_state);
279         /* back channel */
280         ret = nfs4_wait_on_slot_tbl(&ses->bc_slot_table);
281         if (ret)
282                 return ret;
283         /* fore channel */
284         return nfs4_wait_on_slot_tbl(&ses->fc_slot_table);
285 }
286
287 static void nfs41_finish_session_reset(struct nfs_client *clp)
288 {
289         clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
290         clear_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state);
291         /* create_session negotiated new slot table */
292         clear_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state);
293         nfs41_setup_state_renewal(clp);
294 }
295
296 int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
297 {
298         int status;
299
300         if (test_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state))
301                 goto do_confirm;
302         nfs4_begin_drain_session(clp);
303         status = nfs4_proc_exchange_id(clp, cred);
304         if (status != 0)
305                 goto out;
306         set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
307 do_confirm:
308         status = nfs4_proc_create_session(clp, cred);
309         if (status != 0)
310                 goto out;
311         nfs41_finish_session_reset(clp);
312         nfs_mark_client_ready(clp, NFS_CS_READY);
313 out:
314         return status;
315 }
316
317 /**
318  * nfs41_discover_server_trunking - Detect server IP address trunking (mv1)
319  *
320  * @clp: nfs_client under test
321  * @result: OUT: found nfs_client, or clp
322  * @cred: credential to use for trunking test
323  *
324  * Returns NFS4_OK, a negative errno, or a negative NFS4ERR status.
325  * If NFS4_OK is returned, an nfs_client pointer is planted in
326  * "result".
327  *
328  * Note: The returned client may not yet be marked ready.
329  */
330 int nfs41_discover_server_trunking(struct nfs_client *clp,
331                                    struct nfs_client **result,
332                                    struct rpc_cred *cred)
333 {
334         int status;
335
336         status = nfs4_proc_exchange_id(clp, cred);
337         if (status != NFS4_OK)
338                 return status;
339         set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
340
341         return nfs41_walk_client_list(clp, result, cred);
342 }
343
344 struct rpc_cred *nfs4_get_exchange_id_cred(struct nfs_client *clp)
345 {
346         struct rpc_cred *cred;
347
348         spin_lock(&clp->cl_lock);
349         cred = nfs4_get_machine_cred_locked(clp);
350         spin_unlock(&clp->cl_lock);
351         return cred;
352 }
353
354 #endif /* CONFIG_NFS_V4_1 */
355
356 static struct rpc_cred *
357 nfs4_get_setclientid_cred_server(struct nfs_server *server)
358 {
359         struct nfs_client *clp = server->nfs_client;
360         struct rpc_cred *cred = NULL;
361         struct nfs4_state_owner *sp;
362         struct rb_node *pos;
363
364         spin_lock(&clp->cl_lock);
365         pos = rb_first(&server->state_owners);
366         if (pos != NULL) {
367                 sp = rb_entry(pos, struct nfs4_state_owner, so_server_node);
368                 cred = get_rpccred(sp->so_cred);
369         }
370         spin_unlock(&clp->cl_lock);
371         return cred;
372 }
373
374 /**
375  * nfs4_get_setclientid_cred - Acquire credential for a setclientid operation
376  * @clp: client state handle
377  *
378  * Returns an rpc_cred with reference count bumped, or NULL.
379  */
380 struct rpc_cred *nfs4_get_setclientid_cred(struct nfs_client *clp)
381 {
382         struct nfs_server *server;
383         struct rpc_cred *cred;
384
385         spin_lock(&clp->cl_lock);
386         cred = nfs4_get_machine_cred_locked(clp);
387         spin_unlock(&clp->cl_lock);
388         if (cred != NULL)
389                 goto out;
390
391         rcu_read_lock();
392         list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
393                 cred = nfs4_get_setclientid_cred_server(server);
394                 if (cred != NULL)
395                         break;
396         }
397         rcu_read_unlock();
398
399 out:
400         return cred;
401 }
402
403 static struct nfs4_state_owner *
404 nfs4_find_state_owner_locked(struct nfs_server *server, struct rpc_cred *cred)
405 {
406         struct rb_node **p = &server->state_owners.rb_node,
407                        *parent = NULL;
408         struct nfs4_state_owner *sp;
409
410         while (*p != NULL) {
411                 parent = *p;
412                 sp = rb_entry(parent, struct nfs4_state_owner, so_server_node);
413
414                 if (cred < sp->so_cred)
415                         p = &parent->rb_left;
416                 else if (cred > sp->so_cred)
417                         p = &parent->rb_right;
418                 else {
419                         if (!list_empty(&sp->so_lru))
420                                 list_del_init(&sp->so_lru);
421                         atomic_inc(&sp->so_count);
422                         return sp;
423                 }
424         }
425         return NULL;
426 }
427
428 static struct nfs4_state_owner *
429 nfs4_insert_state_owner_locked(struct nfs4_state_owner *new)
430 {
431         struct nfs_server *server = new->so_server;
432         struct rb_node **p = &server->state_owners.rb_node,
433                        *parent = NULL;
434         struct nfs4_state_owner *sp;
435         int err;
436
437         while (*p != NULL) {
438                 parent = *p;
439                 sp = rb_entry(parent, struct nfs4_state_owner, so_server_node);
440
441                 if (new->so_cred < sp->so_cred)
442                         p = &parent->rb_left;
443                 else if (new->so_cred > sp->so_cred)
444                         p = &parent->rb_right;
445                 else {
446                         if (!list_empty(&sp->so_lru))
447                                 list_del_init(&sp->so_lru);
448                         atomic_inc(&sp->so_count);
449                         return sp;
450                 }
451         }
452         err = ida_get_new(&server->openowner_id, &new->so_seqid.owner_id);
453         if (err)
454                 return ERR_PTR(err);
455         rb_link_node(&new->so_server_node, parent, p);
456         rb_insert_color(&new->so_server_node, &server->state_owners);
457         return new;
458 }
459
460 static void
461 nfs4_remove_state_owner_locked(struct nfs4_state_owner *sp)
462 {
463         struct nfs_server *server = sp->so_server;
464
465         if (!RB_EMPTY_NODE(&sp->so_server_node))
466                 rb_erase(&sp->so_server_node, &server->state_owners);
467         ida_remove(&server->openowner_id, sp->so_seqid.owner_id);
468 }
469
470 static void
471 nfs4_init_seqid_counter(struct nfs_seqid_counter *sc)
472 {
473         sc->create_time = ktime_get();
474         sc->flags = 0;
475         sc->counter = 0;
476         spin_lock_init(&sc->lock);
477         INIT_LIST_HEAD(&sc->list);
478         rpc_init_wait_queue(&sc->wait, "Seqid_waitqueue");
479 }
480
481 static void
482 nfs4_destroy_seqid_counter(struct nfs_seqid_counter *sc)
483 {
484         rpc_destroy_wait_queue(&sc->wait);
485 }
486
487 /*
488  * nfs4_alloc_state_owner(): this is called on the OPEN or CREATE path to
489  * create a new state_owner.
490  *
491  */
492 static struct nfs4_state_owner *
493 nfs4_alloc_state_owner(struct nfs_server *server,
494                 struct rpc_cred *cred,
495                 gfp_t gfp_flags)
496 {
497         struct nfs4_state_owner *sp;
498
499         sp = kzalloc(sizeof(*sp), gfp_flags);
500         if (!sp)
501                 return NULL;
502         sp->so_server = server;
503         sp->so_cred = get_rpccred(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_drop_state_owner(struct nfs4_state_owner *sp)
516 {
517         struct rb_node *rb_node = &sp->so_server_node;
518
519         if (!RB_EMPTY_NODE(rb_node)) {
520                 struct nfs_server *server = sp->so_server;
521                 struct nfs_client *clp = server->nfs_client;
522
523                 spin_lock(&clp->cl_lock);
524                 if (!RB_EMPTY_NODE(rb_node)) {
525                         rb_erase(rb_node, &server->state_owners);
526                         RB_CLEAR_NODE(rb_node);
527                 }
528                 spin_unlock(&clp->cl_lock);
529         }
530 }
531
532 static void nfs4_free_state_owner(struct nfs4_state_owner *sp)
533 {
534         nfs4_destroy_seqid_counter(&sp->so_seqid);
535         put_rpccred(sp->so_cred);
536         kfree(sp);
537 }
538
539 static void nfs4_gc_state_owners(struct nfs_server *server)
540 {
541         struct nfs_client *clp = server->nfs_client;
542         struct nfs4_state_owner *sp, *tmp;
543         unsigned long time_min, time_max;
544         LIST_HEAD(doomed);
545
546         spin_lock(&clp->cl_lock);
547         time_max = jiffies;
548         time_min = (long)time_max - (long)clp->cl_lease_time;
549         list_for_each_entry_safe(sp, tmp, &server->state_owners_lru, so_lru) {
550                 /* NB: LRU is sorted so that oldest is at the head */
551                 if (time_in_range(sp->so_expires, time_min, time_max))
552                         break;
553                 list_move(&sp->so_lru, &doomed);
554                 nfs4_remove_state_owner_locked(sp);
555         }
556         spin_unlock(&clp->cl_lock);
557
558         list_for_each_entry_safe(sp, tmp, &doomed, so_lru) {
559                 list_del(&sp->so_lru);
560                 nfs4_free_state_owner(sp);
561         }
562 }
563
564 /**
565  * nfs4_get_state_owner - Look up a state owner given a credential
566  * @server: nfs_server to search
567  * @cred: RPC credential to match
568  *
569  * Returns a pointer to an instantiated nfs4_state_owner struct, or NULL.
570  */
571 struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *server,
572                                               struct rpc_cred *cred,
573                                               gfp_t gfp_flags)
574 {
575         struct nfs_client *clp = server->nfs_client;
576         struct nfs4_state_owner *sp, *new;
577
578         spin_lock(&clp->cl_lock);
579         sp = nfs4_find_state_owner_locked(server, cred);
580         spin_unlock(&clp->cl_lock);
581         if (sp != NULL)
582                 goto out;
583         new = nfs4_alloc_state_owner(server, cred, gfp_flags);
584         if (new == NULL)
585                 goto out;
586         do {
587                 if (ida_pre_get(&server->openowner_id, gfp_flags) == 0)
588                         break;
589                 spin_lock(&clp->cl_lock);
590                 sp = nfs4_insert_state_owner_locked(new);
591                 spin_unlock(&clp->cl_lock);
592         } while (sp == ERR_PTR(-EAGAIN));
593         if (sp != new)
594                 nfs4_free_state_owner(new);
595 out:
596         nfs4_gc_state_owners(server);
597         return sp;
598 }
599
600 /**
601  * nfs4_put_state_owner - Release a nfs4_state_owner
602  * @sp: state owner data to release
603  *
604  * Note that we keep released state owners on an LRU
605  * list.
606  * This caches valid state owners so that they can be
607  * reused, to avoid the OPEN_CONFIRM on minor version 0.
608  * It also pins the uniquifier of dropped state owners for
609  * a while, to ensure that those state owner names are
610  * never reused.
611  */
612 void nfs4_put_state_owner(struct nfs4_state_owner *sp)
613 {
614         struct nfs_server *server = sp->so_server;
615         struct nfs_client *clp = server->nfs_client;
616
617         if (!atomic_dec_and_lock(&sp->so_count, &clp->cl_lock))
618                 return;
619
620         sp->so_expires = jiffies;
621         list_add_tail(&sp->so_lru, &server->state_owners_lru);
622         spin_unlock(&clp->cl_lock);
623 }
624
625 /**
626  * nfs4_purge_state_owners - Release all cached state owners
627  * @server: nfs_server with cached state owners to release
628  *
629  * Called at umount time.  Remaining state owners will be on
630  * the LRU with ref count of zero.
631  */
632 void nfs4_purge_state_owners(struct nfs_server *server)
633 {
634         struct nfs_client *clp = server->nfs_client;
635         struct nfs4_state_owner *sp, *tmp;
636         LIST_HEAD(doomed);
637
638         spin_lock(&clp->cl_lock);
639         list_for_each_entry_safe(sp, tmp, &server->state_owners_lru, so_lru) {
640                 list_move(&sp->so_lru, &doomed);
641                 nfs4_remove_state_owner_locked(sp);
642         }
643         spin_unlock(&clp->cl_lock);
644
645         list_for_each_entry_safe(sp, tmp, &doomed, so_lru) {
646                 list_del(&sp->so_lru);
647                 nfs4_free_state_owner(sp);
648         }
649 }
650
651 static struct nfs4_state *
652 nfs4_alloc_open_state(void)
653 {
654         struct nfs4_state *state;
655
656         state = kzalloc(sizeof(*state), GFP_NOFS);
657         if (!state)
658                 return NULL;
659         atomic_set(&state->count, 1);
660         INIT_LIST_HEAD(&state->lock_states);
661         spin_lock_init(&state->state_lock);
662         seqlock_init(&state->seqlock);
663         return state;
664 }
665
666 void
667 nfs4_state_set_mode_locked(struct nfs4_state *state, fmode_t fmode)
668 {
669         if (state->state == fmode)
670                 return;
671         /* NB! List reordering - see the reclaim code for why.  */
672         if ((fmode & FMODE_WRITE) != (state->state & FMODE_WRITE)) {
673                 if (fmode & FMODE_WRITE)
674                         list_move(&state->open_states, &state->owner->so_states);
675                 else
676                         list_move_tail(&state->open_states, &state->owner->so_states);
677         }
678         state->state = fmode;
679 }
680
681 static struct nfs4_state *
682 __nfs4_find_state_byowner(struct inode *inode, struct nfs4_state_owner *owner)
683 {
684         struct nfs_inode *nfsi = NFS_I(inode);
685         struct nfs4_state *state;
686
687         list_for_each_entry(state, &nfsi->open_states, inode_states) {
688                 if (state->owner != owner)
689                         continue;
690                 if (!nfs4_valid_open_stateid(state))
691                         continue;
692                 if (atomic_inc_not_zero(&state->count))
693                         return state;
694         }
695         return NULL;
696 }
697
698 static void
699 nfs4_free_open_state(struct nfs4_state *state)
700 {
701         kfree(state);
702 }
703
704 struct nfs4_state *
705 nfs4_get_open_state(struct inode *inode, struct nfs4_state_owner *owner)
706 {
707         struct nfs4_state *state, *new;
708         struct nfs_inode *nfsi = NFS_I(inode);
709
710         spin_lock(&inode->i_lock);
711         state = __nfs4_find_state_byowner(inode, owner);
712         spin_unlock(&inode->i_lock);
713         if (state)
714                 goto out;
715         new = nfs4_alloc_open_state();
716         spin_lock(&owner->so_lock);
717         spin_lock(&inode->i_lock);
718         state = __nfs4_find_state_byowner(inode, owner);
719         if (state == NULL && new != NULL) {
720                 state = new;
721                 state->owner = owner;
722                 atomic_inc(&owner->so_count);
723                 list_add(&state->inode_states, &nfsi->open_states);
724                 ihold(inode);
725                 state->inode = inode;
726                 spin_unlock(&inode->i_lock);
727                 /* Note: The reclaim code dictates that we add stateless
728                  * and read-only stateids to the end of the list */
729                 list_add_tail(&state->open_states, &owner->so_states);
730                 spin_unlock(&owner->so_lock);
731         } else {
732                 spin_unlock(&inode->i_lock);
733                 spin_unlock(&owner->so_lock);
734                 if (new)
735                         nfs4_free_open_state(new);
736         }
737 out:
738         return state;
739 }
740
741 void nfs4_put_open_state(struct nfs4_state *state)
742 {
743         struct inode *inode = state->inode;
744         struct nfs4_state_owner *owner = state->owner;
745
746         if (!atomic_dec_and_lock(&state->count, &owner->so_lock))
747                 return;
748         spin_lock(&inode->i_lock);
749         list_del(&state->inode_states);
750         list_del(&state->open_states);
751         spin_unlock(&inode->i_lock);
752         spin_unlock(&owner->so_lock);
753         iput(inode);
754         nfs4_free_open_state(state);
755         nfs4_put_state_owner(owner);
756 }
757
758 /*
759  * Close the current file.
760  */
761 static void __nfs4_close(struct nfs4_state *state,
762                 fmode_t fmode, gfp_t gfp_mask, int wait)
763 {
764         struct nfs4_state_owner *owner = state->owner;
765         int call_close = 0;
766         fmode_t newstate;
767
768         atomic_inc(&owner->so_count);
769         /* Protect against nfs4_find_state() */
770         spin_lock(&owner->so_lock);
771         switch (fmode & (FMODE_READ | FMODE_WRITE)) {
772                 case FMODE_READ:
773                         state->n_rdonly--;
774                         break;
775                 case FMODE_WRITE:
776                         state->n_wronly--;
777                         break;
778                 case FMODE_READ|FMODE_WRITE:
779                         state->n_rdwr--;
780         }
781         newstate = FMODE_READ|FMODE_WRITE;
782         if (state->n_rdwr == 0) {
783                 if (state->n_rdonly == 0) {
784                         newstate &= ~FMODE_READ;
785                         call_close |= test_bit(NFS_O_RDONLY_STATE, &state->flags);
786                         call_close |= test_bit(NFS_O_RDWR_STATE, &state->flags);
787                 }
788                 if (state->n_wronly == 0) {
789                         newstate &= ~FMODE_WRITE;
790                         call_close |= test_bit(NFS_O_WRONLY_STATE, &state->flags);
791                         call_close |= test_bit(NFS_O_RDWR_STATE, &state->flags);
792                 }
793                 if (newstate == 0)
794                         clear_bit(NFS_DELEGATED_STATE, &state->flags);
795         }
796         nfs4_state_set_mode_locked(state, newstate);
797         spin_unlock(&owner->so_lock);
798
799         if (!call_close) {
800                 nfs4_put_open_state(state);
801                 nfs4_put_state_owner(owner);
802         } else
803                 nfs4_do_close(state, gfp_mask, wait);
804 }
805
806 void nfs4_close_state(struct nfs4_state *state, fmode_t fmode)
807 {
808         __nfs4_close(state, fmode, GFP_NOFS, 0);
809 }
810
811 void nfs4_close_sync(struct nfs4_state *state, fmode_t fmode)
812 {
813         __nfs4_close(state, fmode, GFP_KERNEL, 1);
814 }
815
816 /*
817  * Search the state->lock_states for an existing lock_owner
818  * that is compatible with current->files
819  */
820 static struct nfs4_lock_state *
821 __nfs4_find_lock_state(struct nfs4_state *state, fl_owner_t fl_owner, pid_t fl_pid, unsigned int type)
822 {
823         struct nfs4_lock_state *pos;
824         list_for_each_entry(pos, &state->lock_states, ls_locks) {
825                 if (type != NFS4_ANY_LOCK_TYPE && pos->ls_owner.lo_type != type)
826                         continue;
827                 switch (pos->ls_owner.lo_type) {
828                 case NFS4_POSIX_LOCK_TYPE:
829                         if (pos->ls_owner.lo_u.posix_owner != fl_owner)
830                                 continue;
831                         break;
832                 case NFS4_FLOCK_LOCK_TYPE:
833                         if (pos->ls_owner.lo_u.flock_owner != fl_pid)
834                                 continue;
835                 }
836                 atomic_inc(&pos->ls_count);
837                 return pos;
838         }
839         return NULL;
840 }
841
842 /*
843  * Return a compatible lock_state. If no initialized lock_state structure
844  * exists, return an uninitialized one.
845  *
846  */
847 static struct nfs4_lock_state *nfs4_alloc_lock_state(struct nfs4_state *state, fl_owner_t fl_owner, pid_t fl_pid, unsigned int type)
848 {
849         struct nfs4_lock_state *lsp;
850         struct nfs_server *server = state->owner->so_server;
851
852         lsp = kzalloc(sizeof(*lsp), GFP_NOFS);
853         if (lsp == NULL)
854                 return NULL;
855         nfs4_init_seqid_counter(&lsp->ls_seqid);
856         atomic_set(&lsp->ls_count, 1);
857         lsp->ls_state = state;
858         lsp->ls_owner.lo_type = type;
859         switch (lsp->ls_owner.lo_type) {
860         case NFS4_FLOCK_LOCK_TYPE:
861                 lsp->ls_owner.lo_u.flock_owner = fl_pid;
862                 break;
863         case NFS4_POSIX_LOCK_TYPE:
864                 lsp->ls_owner.lo_u.posix_owner = fl_owner;
865                 break;
866         default:
867                 goto out_free;
868         }
869         lsp->ls_seqid.owner_id = ida_simple_get(&server->lockowner_id, 0, 0, GFP_NOFS);
870         if (lsp->ls_seqid.owner_id < 0)
871                 goto out_free;
872         INIT_LIST_HEAD(&lsp->ls_locks);
873         return lsp;
874 out_free:
875         kfree(lsp);
876         return NULL;
877 }
878
879 void nfs4_free_lock_state(struct nfs_server *server, struct nfs4_lock_state *lsp)
880 {
881         ida_simple_remove(&server->lockowner_id, lsp->ls_seqid.owner_id);
882         nfs4_destroy_seqid_counter(&lsp->ls_seqid);
883         kfree(lsp);
884 }
885
886 /*
887  * Return a compatible lock_state. If no initialized lock_state structure
888  * exists, return an uninitialized one.
889  *
890  */
891 static struct nfs4_lock_state *nfs4_get_lock_state(struct nfs4_state *state, fl_owner_t owner, pid_t pid, unsigned int type)
892 {
893         struct nfs4_lock_state *lsp, *new = NULL;
894         
895         for(;;) {
896                 spin_lock(&state->state_lock);
897                 lsp = __nfs4_find_lock_state(state, owner, pid, type);
898                 if (lsp != NULL)
899                         break;
900                 if (new != NULL) {
901                         list_add(&new->ls_locks, &state->lock_states);
902                         set_bit(LK_STATE_IN_USE, &state->flags);
903                         lsp = new;
904                         new = NULL;
905                         break;
906                 }
907                 spin_unlock(&state->state_lock);
908                 new = nfs4_alloc_lock_state(state, owner, pid, type);
909                 if (new == NULL)
910                         return NULL;
911         }
912         spin_unlock(&state->state_lock);
913         if (new != NULL)
914                 nfs4_free_lock_state(state->owner->so_server, new);
915         return lsp;
916 }
917
918 /*
919  * Release reference to lock_state, and free it if we see that
920  * it is no longer in use
921  */
922 void nfs4_put_lock_state(struct nfs4_lock_state *lsp)
923 {
924         struct nfs_server *server;
925         struct nfs4_state *state;
926
927         if (lsp == NULL)
928                 return;
929         state = lsp->ls_state;
930         if (!atomic_dec_and_lock(&lsp->ls_count, &state->state_lock))
931                 return;
932         list_del(&lsp->ls_locks);
933         if (list_empty(&state->lock_states))
934                 clear_bit(LK_STATE_IN_USE, &state->flags);
935         spin_unlock(&state->state_lock);
936         server = state->owner->so_server;
937         if (test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags)) {
938                 struct nfs_client *clp = server->nfs_client;
939
940                 clp->cl_mvops->free_lock_state(server, lsp);
941         } else
942                 nfs4_free_lock_state(server, lsp);
943 }
944
945 static void nfs4_fl_copy_lock(struct file_lock *dst, struct file_lock *src)
946 {
947         struct nfs4_lock_state *lsp = src->fl_u.nfs4_fl.owner;
948
949         dst->fl_u.nfs4_fl.owner = lsp;
950         atomic_inc(&lsp->ls_count);
951 }
952
953 static void nfs4_fl_release_lock(struct file_lock *fl)
954 {
955         nfs4_put_lock_state(fl->fl_u.nfs4_fl.owner);
956 }
957
958 static const struct file_lock_operations nfs4_fl_lock_ops = {
959         .fl_copy_lock = nfs4_fl_copy_lock,
960         .fl_release_private = nfs4_fl_release_lock,
961 };
962
963 int nfs4_set_lock_state(struct nfs4_state *state, struct file_lock *fl)
964 {
965         struct nfs4_lock_state *lsp;
966
967         if (fl->fl_ops != NULL)
968                 return 0;
969         if (fl->fl_flags & FL_POSIX)
970                 lsp = nfs4_get_lock_state(state, fl->fl_owner, 0, NFS4_POSIX_LOCK_TYPE);
971         else if (fl->fl_flags & FL_FLOCK)
972                 lsp = nfs4_get_lock_state(state, NULL, fl->fl_pid,
973                                 NFS4_FLOCK_LOCK_TYPE);
974         else
975                 return -EINVAL;
976         if (lsp == NULL)
977                 return -ENOMEM;
978         fl->fl_u.nfs4_fl.owner = lsp;
979         fl->fl_ops = &nfs4_fl_lock_ops;
980         return 0;
981 }
982
983 static int nfs4_copy_lock_stateid(nfs4_stateid *dst,
984                 struct nfs4_state *state,
985                 const struct nfs_lockowner *lockowner)
986 {
987         struct nfs4_lock_state *lsp;
988         fl_owner_t fl_owner;
989         pid_t fl_pid;
990         int ret = -ENOENT;
991
992
993         if (lockowner == NULL)
994                 goto out;
995
996         if (test_bit(LK_STATE_IN_USE, &state->flags) == 0)
997                 goto out;
998
999         fl_owner = lockowner->l_owner;
1000         fl_pid = lockowner->l_pid;
1001         spin_lock(&state->state_lock);
1002         lsp = __nfs4_find_lock_state(state, fl_owner, fl_pid, NFS4_ANY_LOCK_TYPE);
1003         if (lsp != NULL && test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags) != 0) {
1004                 nfs4_stateid_copy(dst, &lsp->ls_stateid);
1005                 ret = 0;
1006                 smp_rmb();
1007                 if (!list_empty(&lsp->ls_seqid.list))
1008                         ret = -EWOULDBLOCK;
1009         }
1010         spin_unlock(&state->state_lock);
1011         nfs4_put_lock_state(lsp);
1012 out:
1013         return ret;
1014 }
1015
1016 static int nfs4_copy_open_stateid(nfs4_stateid *dst, struct nfs4_state *state)
1017 {
1018         const nfs4_stateid *src;
1019         int ret;
1020         int seq;
1021
1022         do {
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                 nfs4_stateid_copy(dst, src);
1028                 ret = 0;
1029                 smp_rmb();
1030                 if (!list_empty(&state->owner->so_seqid.list))
1031                         ret = -EWOULDBLOCK;
1032         } while (read_seqretry(&state->seqlock, seq));
1033         return ret;
1034 }
1035
1036 /*
1037  * Byte-range lock aware utility to initialize the stateid of read/write
1038  * requests.
1039  */
1040 int nfs4_select_rw_stateid(nfs4_stateid *dst, struct nfs4_state *state,
1041                 fmode_t fmode, const struct nfs_lockowner *lockowner)
1042 {
1043         int ret = 0;
1044         if (nfs4_copy_delegation_stateid(dst, state->inode, fmode))
1045                 goto out;
1046         ret = nfs4_copy_lock_stateid(dst, state, lockowner);
1047         if (ret != -ENOENT)
1048                 goto out;
1049         ret = nfs4_copy_open_stateid(dst, state);
1050 out:
1051         if (nfs_server_capable(state->inode, NFS_CAP_STATEID_NFSV41))
1052                 dst->seqid = 0;
1053         return ret;
1054 }
1055
1056 struct nfs_seqid *nfs_alloc_seqid(struct nfs_seqid_counter *counter, gfp_t gfp_mask)
1057 {
1058         struct nfs_seqid *new;
1059
1060         new = kmalloc(sizeof(*new), gfp_mask);
1061         if (new != NULL) {
1062                 new->sequence = counter;
1063                 INIT_LIST_HEAD(&new->list);
1064                 new->task = NULL;
1065         }
1066         return new;
1067 }
1068
1069 void nfs_release_seqid(struct nfs_seqid *seqid)
1070 {
1071         struct nfs_seqid_counter *sequence;
1072
1073         if (list_empty(&seqid->list))
1074                 return;
1075         sequence = seqid->sequence;
1076         spin_lock(&sequence->lock);
1077         list_del_init(&seqid->list);
1078         if (!list_empty(&sequence->list)) {
1079                 struct nfs_seqid *next;
1080
1081                 next = list_first_entry(&sequence->list,
1082                                 struct nfs_seqid, list);
1083                 rpc_wake_up_queued_task(&sequence->wait, next->task);
1084         }
1085         spin_unlock(&sequence->lock);
1086 }
1087
1088 void nfs_free_seqid(struct nfs_seqid *seqid)
1089 {
1090         nfs_release_seqid(seqid);
1091         kfree(seqid);
1092 }
1093
1094 /*
1095  * Increment the seqid if the OPEN/OPEN_DOWNGRADE/CLOSE succeeded, or
1096  * failed with a seqid incrementing error -
1097  * see comments nfs_fs.h:seqid_mutating_error()
1098  */
1099 static void nfs_increment_seqid(int status, struct nfs_seqid *seqid)
1100 {
1101         switch (status) {
1102                 case 0:
1103                         break;
1104                 case -NFS4ERR_BAD_SEQID:
1105                         if (seqid->sequence->flags & NFS_SEQID_CONFIRMED)
1106                                 return;
1107                         pr_warn_ratelimited("NFS: v4 server returned a bad"
1108                                         " sequence-id error on an"
1109                                         " unconfirmed sequence %p!\n",
1110                                         seqid->sequence);
1111                 case -NFS4ERR_STALE_CLIENTID:
1112                 case -NFS4ERR_STALE_STATEID:
1113                 case -NFS4ERR_BAD_STATEID:
1114                 case -NFS4ERR_BADXDR:
1115                 case -NFS4ERR_RESOURCE:
1116                 case -NFS4ERR_NOFILEHANDLE:
1117                         /* Non-seqid mutating errors */
1118                         return;
1119         };
1120         /*
1121          * Note: no locking needed as we are guaranteed to be first
1122          * on the sequence list
1123          */
1124         seqid->sequence->counter++;
1125 }
1126
1127 void nfs_increment_open_seqid(int status, struct nfs_seqid *seqid)
1128 {
1129         struct nfs4_state_owner *sp = container_of(seqid->sequence,
1130                                         struct nfs4_state_owner, so_seqid);
1131         struct nfs_server *server = sp->so_server;
1132
1133         if (status == -NFS4ERR_BAD_SEQID)
1134                 nfs4_drop_state_owner(sp);
1135         if (!nfs4_has_session(server->nfs_client))
1136                 nfs_increment_seqid(status, seqid);
1137 }
1138
1139 /*
1140  * Increment the seqid if the LOCK/LOCKU succeeded, or
1141  * failed with a seqid incrementing error -
1142  * see comments nfs_fs.h:seqid_mutating_error()
1143  */
1144 void nfs_increment_lock_seqid(int status, struct nfs_seqid *seqid)
1145 {
1146         nfs_increment_seqid(status, seqid);
1147 }
1148
1149 int nfs_wait_on_sequence(struct nfs_seqid *seqid, struct rpc_task *task)
1150 {
1151         struct nfs_seqid_counter *sequence = seqid->sequence;
1152         int status = 0;
1153
1154         spin_lock(&sequence->lock);
1155         seqid->task = task;
1156         if (list_empty(&seqid->list))
1157                 list_add_tail(&seqid->list, &sequence->list);
1158         if (list_first_entry(&sequence->list, struct nfs_seqid, list) == seqid)
1159                 goto unlock;
1160         rpc_sleep_on(&sequence->wait, task, NULL);
1161         status = -EAGAIN;
1162 unlock:
1163         spin_unlock(&sequence->lock);
1164         return status;
1165 }
1166
1167 static int nfs4_run_state_manager(void *);
1168
1169 static void nfs4_clear_state_manager_bit(struct nfs_client *clp)
1170 {
1171         smp_mb__before_clear_bit();
1172         clear_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state);
1173         smp_mb__after_clear_bit();
1174         wake_up_bit(&clp->cl_state, NFS4CLNT_MANAGER_RUNNING);
1175         rpc_wake_up(&clp->cl_rpcwaitq);
1176 }
1177
1178 /*
1179  * Schedule the nfs_client asynchronous state management routine
1180  */
1181 void nfs4_schedule_state_manager(struct nfs_client *clp)
1182 {
1183         struct task_struct *task;
1184         char buf[INET6_ADDRSTRLEN + sizeof("-manager") + 1];
1185
1186         if (test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) != 0)
1187                 return;
1188         __module_get(THIS_MODULE);
1189         atomic_inc(&clp->cl_count);
1190
1191         /* The rcu_read_lock() is not strictly necessary, as the state
1192          * manager is the only thread that ever changes the rpc_xprt
1193          * after it's initialized.  At this point, we're single threaded. */
1194         rcu_read_lock();
1195         snprintf(buf, sizeof(buf), "%s-manager",
1196                         rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_ADDR));
1197         rcu_read_unlock();
1198         task = kthread_run(nfs4_run_state_manager, clp, buf);
1199         if (IS_ERR(task)) {
1200                 printk(KERN_ERR "%s: kthread_run: %ld\n",
1201                         __func__, PTR_ERR(task));
1202                 nfs4_clear_state_manager_bit(clp);
1203                 nfs_put_client(clp);
1204                 module_put(THIS_MODULE);
1205         }
1206 }
1207
1208 /*
1209  * Schedule a lease recovery attempt
1210  */
1211 void nfs4_schedule_lease_recovery(struct nfs_client *clp)
1212 {
1213         if (!clp)
1214                 return;
1215         if (!test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state))
1216                 set_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state);
1217         dprintk("%s: scheduling lease recovery for server %s\n", __func__,
1218                         clp->cl_hostname);
1219         nfs4_schedule_state_manager(clp);
1220 }
1221 EXPORT_SYMBOL_GPL(nfs4_schedule_lease_recovery);
1222
1223 int nfs4_wait_clnt_recover(struct nfs_client *clp)
1224 {
1225         int res;
1226
1227         might_sleep();
1228
1229         res = wait_on_bit(&clp->cl_state, NFS4CLNT_MANAGER_RUNNING,
1230                         nfs_wait_bit_killable, TASK_KILLABLE);
1231         if (res)
1232                 return res;
1233
1234         if (clp->cl_cons_state < 0)
1235                 return clp->cl_cons_state;
1236         return 0;
1237 }
1238
1239 int nfs4_client_recover_expired_lease(struct nfs_client *clp)
1240 {
1241         unsigned int loop;
1242         int ret;
1243
1244         for (loop = NFS4_MAX_LOOP_ON_RECOVER; loop != 0; loop--) {
1245                 ret = nfs4_wait_clnt_recover(clp);
1246                 if (ret != 0)
1247                         break;
1248                 if (!test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) &&
1249                     !test_bit(NFS4CLNT_CHECK_LEASE,&clp->cl_state))
1250                         break;
1251                 nfs4_schedule_state_manager(clp);
1252                 ret = -EIO;
1253         }
1254         return ret;
1255 }
1256
1257 /*
1258  * nfs40_handle_cb_pathdown - return all delegations after NFS4ERR_CB_PATH_DOWN
1259  * @clp: client to process
1260  *
1261  * Set the NFS4CLNT_LEASE_EXPIRED state in order to force a
1262  * resend of the SETCLIENTID and hence re-establish the
1263  * callback channel. Then return all existing delegations.
1264  */
1265 static void nfs40_handle_cb_pathdown(struct nfs_client *clp)
1266 {
1267         set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
1268         nfs_expire_all_delegations(clp);
1269         dprintk("%s: handling CB_PATHDOWN recovery for server %s\n", __func__,
1270                         clp->cl_hostname);
1271 }
1272
1273 void nfs4_schedule_path_down_recovery(struct nfs_client *clp)
1274 {
1275         nfs40_handle_cb_pathdown(clp);
1276         nfs4_schedule_state_manager(clp);
1277 }
1278
1279 static int nfs4_state_mark_reclaim_reboot(struct nfs_client *clp, struct nfs4_state *state)
1280 {
1281
1282         set_bit(NFS_STATE_RECLAIM_REBOOT, &state->flags);
1283         /* Don't recover state that expired before the reboot */
1284         if (test_bit(NFS_STATE_RECLAIM_NOGRACE, &state->flags)) {
1285                 clear_bit(NFS_STATE_RECLAIM_REBOOT, &state->flags);
1286                 return 0;
1287         }
1288         set_bit(NFS_OWNER_RECLAIM_REBOOT, &state->owner->so_flags);
1289         set_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state);
1290         return 1;
1291 }
1292
1293 static int nfs4_state_mark_reclaim_nograce(struct nfs_client *clp, struct nfs4_state *state)
1294 {
1295         set_bit(NFS_STATE_RECLAIM_NOGRACE, &state->flags);
1296         clear_bit(NFS_STATE_RECLAIM_REBOOT, &state->flags);
1297         set_bit(NFS_OWNER_RECLAIM_NOGRACE, &state->owner->so_flags);
1298         set_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state);
1299         return 1;
1300 }
1301
1302 int nfs4_schedule_stateid_recovery(const struct nfs_server *server, struct nfs4_state *state)
1303 {
1304         struct nfs_client *clp = server->nfs_client;
1305
1306         if (!nfs4_valid_open_stateid(state))
1307                 return -EBADF;
1308         nfs4_state_mark_reclaim_nograce(clp, state);
1309         dprintk("%s: scheduling stateid recovery for server %s\n", __func__,
1310                         clp->cl_hostname);
1311         nfs4_schedule_state_manager(clp);
1312         return 0;
1313 }
1314 EXPORT_SYMBOL_GPL(nfs4_schedule_stateid_recovery);
1315
1316 void nfs_inode_find_state_and_recover(struct inode *inode,
1317                 const nfs4_stateid *stateid)
1318 {
1319         struct nfs_client *clp = NFS_SERVER(inode)->nfs_client;
1320         struct nfs_inode *nfsi = NFS_I(inode);
1321         struct nfs_open_context *ctx;
1322         struct nfs4_state *state;
1323         bool found = false;
1324
1325         spin_lock(&inode->i_lock);
1326         list_for_each_entry(ctx, &nfsi->open_files, list) {
1327                 state = ctx->state;
1328                 if (state == NULL)
1329                         continue;
1330                 if (!test_bit(NFS_DELEGATED_STATE, &state->flags))
1331                         continue;
1332                 if (!nfs4_stateid_match(&state->stateid, stateid))
1333                         continue;
1334                 nfs4_state_mark_reclaim_nograce(clp, state);
1335                 found = true;
1336         }
1337         spin_unlock(&inode->i_lock);
1338         if (found)
1339                 nfs4_schedule_state_manager(clp);
1340 }
1341
1342 static void nfs4_state_mark_open_context_bad(struct nfs4_state *state)
1343 {
1344         struct inode *inode = state->inode;
1345         struct nfs_inode *nfsi = NFS_I(inode);
1346         struct nfs_open_context *ctx;
1347
1348         spin_lock(&inode->i_lock);
1349         list_for_each_entry(ctx, &nfsi->open_files, list) {
1350                 if (ctx->state != state)
1351                         continue;
1352                 set_bit(NFS_CONTEXT_BAD, &ctx->flags);
1353         }
1354         spin_unlock(&inode->i_lock);
1355 }
1356
1357 static void nfs4_state_mark_recovery_failed(struct nfs4_state *state, int error)
1358 {
1359         set_bit(NFS_STATE_RECOVERY_FAILED, &state->flags);
1360         nfs4_state_mark_open_context_bad(state);
1361 }
1362
1363
1364 static int nfs4_reclaim_locks(struct nfs4_state *state, const struct nfs4_state_recovery_ops *ops)
1365 {
1366         struct inode *inode = state->inode;
1367         struct nfs_inode *nfsi = NFS_I(inode);
1368         struct file_lock *fl;
1369         int status = 0;
1370
1371         if (inode->i_flock == NULL)
1372                 return 0;
1373
1374         /* Guard against delegation returns and new lock/unlock calls */
1375         down_write(&nfsi->rwsem);
1376         /* Protect inode->i_flock using the BKL */
1377         lock_flocks();
1378         for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
1379                 if (!(fl->fl_flags & (FL_POSIX|FL_FLOCK)))
1380                         continue;
1381                 if (nfs_file_open_context(fl->fl_file)->state != state)
1382                         continue;
1383                 unlock_flocks();
1384                 status = ops->recover_lock(state, fl);
1385                 switch (status) {
1386                         case 0:
1387                                 break;
1388                         case -ESTALE:
1389                         case -NFS4ERR_ADMIN_REVOKED:
1390                         case -NFS4ERR_STALE_STATEID:
1391                         case -NFS4ERR_BAD_STATEID:
1392                         case -NFS4ERR_EXPIRED:
1393                         case -NFS4ERR_NO_GRACE:
1394                         case -NFS4ERR_STALE_CLIENTID:
1395                         case -NFS4ERR_BADSESSION:
1396                         case -NFS4ERR_BADSLOT:
1397                         case -NFS4ERR_BAD_HIGH_SLOT:
1398                         case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
1399                                 goto out;
1400                         default:
1401                                 printk(KERN_ERR "NFS: %s: unhandled error %d. "
1402                                         "Zeroing state\n", __func__, status);
1403                         case -ENOMEM:
1404                         case -NFS4ERR_DENIED:
1405                         case -NFS4ERR_RECLAIM_BAD:
1406                         case -NFS4ERR_RECLAIM_CONFLICT:
1407                                 /* kill_proc(fl->fl_pid, SIGLOST, 1); */
1408                                 status = 0;
1409                 }
1410                 lock_flocks();
1411         }
1412         unlock_flocks();
1413 out:
1414         up_write(&nfsi->rwsem);
1415         return status;
1416 }
1417
1418 static int nfs4_reclaim_open_state(struct nfs4_state_owner *sp, const struct nfs4_state_recovery_ops *ops)
1419 {
1420         struct nfs4_state *state;
1421         struct nfs4_lock_state *lock;
1422         int status = 0;
1423
1424         /* Note: we rely on the sp->so_states list being ordered 
1425          * so that we always reclaim open(O_RDWR) and/or open(O_WRITE)
1426          * states first.
1427          * This is needed to ensure that the server won't give us any
1428          * read delegations that we have to return if, say, we are
1429          * recovering after a network partition or a reboot from a
1430          * server that doesn't support a grace period.
1431          */
1432         spin_lock(&sp->so_lock);
1433         write_seqcount_begin(&sp->so_reclaim_seqcount);
1434 restart:
1435         list_for_each_entry(state, &sp->so_states, open_states) {
1436                 if (!test_and_clear_bit(ops->state_flag_bit, &state->flags))
1437                         continue;
1438                 if (!nfs4_valid_open_stateid(state))
1439                         continue;
1440                 if (state->state == 0)
1441                         continue;
1442                 atomic_inc(&state->count);
1443                 spin_unlock(&sp->so_lock);
1444                 status = ops->recover_open(sp, state);
1445                 if (status >= 0) {
1446                         status = nfs4_reclaim_locks(state, ops);
1447                         if (status >= 0) {
1448                                 spin_lock(&state->state_lock);
1449                                 list_for_each_entry(lock, &state->lock_states, ls_locks) {
1450                                         if (!test_bit(NFS_LOCK_INITIALIZED, &lock->ls_flags))
1451                                                 pr_warn_ratelimited("NFS: "
1452                                                         "%s: Lock reclaim "
1453                                                         "failed!\n", __func__);
1454                                 }
1455                                 spin_unlock(&state->state_lock);
1456                                 nfs4_put_open_state(state);
1457                                 spin_lock(&sp->so_lock);
1458                                 goto restart;
1459                         }
1460                 }
1461                 switch (status) {
1462                         default:
1463                                 printk(KERN_ERR "NFS: %s: unhandled error %d. "
1464                                         "Zeroing state\n", __func__, status);
1465                         case -ENOENT:
1466                         case -ENOMEM:
1467                         case -ESTALE:
1468                                 /*
1469                                  * Open state on this file cannot be recovered
1470                                  * All we can do is revert to using the zero stateid.
1471                                  */
1472                                 nfs4_state_mark_recovery_failed(state, status);
1473                                 break;
1474                         case -EAGAIN:
1475                                 ssleep(1);
1476                         case -NFS4ERR_ADMIN_REVOKED:
1477                         case -NFS4ERR_STALE_STATEID:
1478                         case -NFS4ERR_BAD_STATEID:
1479                         case -NFS4ERR_RECLAIM_BAD:
1480                         case -NFS4ERR_RECLAIM_CONFLICT:
1481                                 nfs4_state_mark_reclaim_nograce(sp->so_server->nfs_client, state);
1482                                 break;
1483                         case -NFS4ERR_EXPIRED:
1484                         case -NFS4ERR_NO_GRACE:
1485                                 nfs4_state_mark_reclaim_nograce(sp->so_server->nfs_client, state);
1486                         case -NFS4ERR_STALE_CLIENTID:
1487                         case -NFS4ERR_BADSESSION:
1488                         case -NFS4ERR_BADSLOT:
1489                         case -NFS4ERR_BAD_HIGH_SLOT:
1490                         case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
1491                                 goto out_err;
1492                 }
1493                 nfs4_put_open_state(state);
1494                 spin_lock(&sp->so_lock);
1495                 goto restart;
1496         }
1497         write_seqcount_end(&sp->so_reclaim_seqcount);
1498         spin_unlock(&sp->so_lock);
1499         return 0;
1500 out_err:
1501         nfs4_put_open_state(state);
1502         spin_lock(&sp->so_lock);
1503         write_seqcount_end(&sp->so_reclaim_seqcount);
1504         spin_unlock(&sp->so_lock);
1505         return status;
1506 }
1507
1508 static void nfs4_clear_open_state(struct nfs4_state *state)
1509 {
1510         struct nfs4_lock_state *lock;
1511
1512         clear_bit(NFS_DELEGATED_STATE, &state->flags);
1513         clear_bit(NFS_O_RDONLY_STATE, &state->flags);
1514         clear_bit(NFS_O_WRONLY_STATE, &state->flags);
1515         clear_bit(NFS_O_RDWR_STATE, &state->flags);
1516         spin_lock(&state->state_lock);
1517         list_for_each_entry(lock, &state->lock_states, ls_locks) {
1518                 lock->ls_seqid.flags = 0;
1519                 clear_bit(NFS_LOCK_INITIALIZED, &lock->ls_flags);
1520         }
1521         spin_unlock(&state->state_lock);
1522 }
1523
1524 static void nfs4_reset_seqids(struct nfs_server *server,
1525         int (*mark_reclaim)(struct nfs_client *clp, struct nfs4_state *state))
1526 {
1527         struct nfs_client *clp = server->nfs_client;
1528         struct nfs4_state_owner *sp;
1529         struct rb_node *pos;
1530         struct nfs4_state *state;
1531
1532         spin_lock(&clp->cl_lock);
1533         for (pos = rb_first(&server->state_owners);
1534              pos != NULL;
1535              pos = rb_next(pos)) {
1536                 sp = rb_entry(pos, struct nfs4_state_owner, so_server_node);
1537                 sp->so_seqid.flags = 0;
1538                 spin_lock(&sp->so_lock);
1539                 list_for_each_entry(state, &sp->so_states, open_states) {
1540                         if (mark_reclaim(clp, state))
1541                                 nfs4_clear_open_state(state);
1542                 }
1543                 spin_unlock(&sp->so_lock);
1544         }
1545         spin_unlock(&clp->cl_lock);
1546 }
1547
1548 static void nfs4_state_mark_reclaim_helper(struct nfs_client *clp,
1549         int (*mark_reclaim)(struct nfs_client *clp, struct nfs4_state *state))
1550 {
1551         struct nfs_server *server;
1552
1553         rcu_read_lock();
1554         list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
1555                 nfs4_reset_seqids(server, mark_reclaim);
1556         rcu_read_unlock();
1557 }
1558
1559 static void nfs4_state_start_reclaim_reboot(struct nfs_client *clp)
1560 {
1561         /* Mark all delegations for reclaim */
1562         nfs_delegation_mark_reclaim(clp);
1563         nfs4_state_mark_reclaim_helper(clp, nfs4_state_mark_reclaim_reboot);
1564 }
1565
1566 static void nfs4_reclaim_complete(struct nfs_client *clp,
1567                                  const struct nfs4_state_recovery_ops *ops)
1568 {
1569         /* Notify the server we're done reclaiming our state */
1570         if (ops->reclaim_complete)
1571                 (void)ops->reclaim_complete(clp);
1572 }
1573
1574 static void nfs4_clear_reclaim_server(struct nfs_server *server)
1575 {
1576         struct nfs_client *clp = server->nfs_client;
1577         struct nfs4_state_owner *sp;
1578         struct rb_node *pos;
1579         struct nfs4_state *state;
1580
1581         spin_lock(&clp->cl_lock);
1582         for (pos = rb_first(&server->state_owners);
1583              pos != NULL;
1584              pos = rb_next(pos)) {
1585                 sp = rb_entry(pos, struct nfs4_state_owner, so_server_node);
1586                 spin_lock(&sp->so_lock);
1587                 list_for_each_entry(state, &sp->so_states, open_states) {
1588                         if (!test_and_clear_bit(NFS_STATE_RECLAIM_REBOOT,
1589                                                 &state->flags))
1590                                 continue;
1591                         nfs4_state_mark_reclaim_nograce(clp, state);
1592                 }
1593                 spin_unlock(&sp->so_lock);
1594         }
1595         spin_unlock(&clp->cl_lock);
1596 }
1597
1598 static int nfs4_state_clear_reclaim_reboot(struct nfs_client *clp)
1599 {
1600         struct nfs_server *server;
1601
1602         if (!test_and_clear_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state))
1603                 return 0;
1604
1605         rcu_read_lock();
1606         list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
1607                 nfs4_clear_reclaim_server(server);
1608         rcu_read_unlock();
1609
1610         nfs_delegation_reap_unclaimed(clp);
1611         return 1;
1612 }
1613
1614 static void nfs4_state_end_reclaim_reboot(struct nfs_client *clp)
1615 {
1616         if (!nfs4_state_clear_reclaim_reboot(clp))
1617                 return;
1618         nfs4_reclaim_complete(clp, clp->cl_mvops->reboot_recovery_ops);
1619 }
1620
1621 static void nfs_delegation_clear_all(struct nfs_client *clp)
1622 {
1623         nfs_delegation_mark_reclaim(clp);
1624         nfs_delegation_reap_unclaimed(clp);
1625 }
1626
1627 static void nfs4_state_start_reclaim_nograce(struct nfs_client *clp)
1628 {
1629         nfs_delegation_clear_all(clp);
1630         nfs4_state_mark_reclaim_helper(clp, nfs4_state_mark_reclaim_nograce);
1631 }
1632
1633 static int nfs4_recovery_handle_error(struct nfs_client *clp, int error)
1634 {
1635         switch (error) {
1636                 case 0:
1637                         break;
1638                 case -NFS4ERR_CB_PATH_DOWN:
1639                         nfs40_handle_cb_pathdown(clp);
1640                         break;
1641                 case -NFS4ERR_NO_GRACE:
1642                         nfs4_state_end_reclaim_reboot(clp);
1643                         break;
1644                 case -NFS4ERR_STALE_CLIENTID:
1645                 case -NFS4ERR_LEASE_MOVED:
1646                         set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
1647                         nfs4_state_clear_reclaim_reboot(clp);
1648                         nfs4_state_start_reclaim_reboot(clp);
1649                         break;
1650                 case -NFS4ERR_EXPIRED:
1651                         set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
1652                         nfs4_state_start_reclaim_nograce(clp);
1653                         break;
1654                 case -NFS4ERR_BADSESSION:
1655                 case -NFS4ERR_BADSLOT:
1656                 case -NFS4ERR_BAD_HIGH_SLOT:
1657                 case -NFS4ERR_DEADSESSION:
1658                 case -NFS4ERR_SEQ_FALSE_RETRY:
1659                 case -NFS4ERR_SEQ_MISORDERED:
1660                         set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state);
1661                         /* Zero session reset errors */
1662                         break;
1663                 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
1664                         set_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state);
1665                         break;
1666                 default:
1667                         dprintk("%s: failed to handle error %d for server %s\n",
1668                                         __func__, error, clp->cl_hostname);
1669                         return error;
1670         }
1671         dprintk("%s: handled error %d for server %s\n", __func__, error,
1672                         clp->cl_hostname);
1673         return 0;
1674 }
1675
1676 static int nfs4_do_reclaim(struct nfs_client *clp, const struct nfs4_state_recovery_ops *ops)
1677 {
1678         struct nfs4_state_owner *sp;
1679         struct nfs_server *server;
1680         struct rb_node *pos;
1681         int status = 0;
1682
1683 restart:
1684         rcu_read_lock();
1685         list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
1686                 nfs4_purge_state_owners(server);
1687                 spin_lock(&clp->cl_lock);
1688                 for (pos = rb_first(&server->state_owners);
1689                      pos != NULL;
1690                      pos = rb_next(pos)) {
1691                         sp = rb_entry(pos,
1692                                 struct nfs4_state_owner, so_server_node);
1693                         if (!test_and_clear_bit(ops->owner_flag_bit,
1694                                                         &sp->so_flags))
1695                                 continue;
1696                         atomic_inc(&sp->so_count);
1697                         spin_unlock(&clp->cl_lock);
1698                         rcu_read_unlock();
1699
1700                         status = nfs4_reclaim_open_state(sp, ops);
1701                         if (status < 0) {
1702                                 set_bit(ops->owner_flag_bit, &sp->so_flags);
1703                                 nfs4_put_state_owner(sp);
1704                                 return nfs4_recovery_handle_error(clp, status);
1705                         }
1706
1707                         nfs4_put_state_owner(sp);
1708                         goto restart;
1709                 }
1710                 spin_unlock(&clp->cl_lock);
1711         }
1712         rcu_read_unlock();
1713         return status;
1714 }
1715
1716 static int nfs4_check_lease(struct nfs_client *clp)
1717 {
1718         struct rpc_cred *cred;
1719         const struct nfs4_state_maintenance_ops *ops =
1720                 clp->cl_mvops->state_renewal_ops;
1721         int status;
1722
1723         /* Is the client already known to have an expired lease? */
1724         if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state))
1725                 return 0;
1726         spin_lock(&clp->cl_lock);
1727         cred = ops->get_state_renewal_cred_locked(clp);
1728         spin_unlock(&clp->cl_lock);
1729         if (cred == NULL) {
1730                 cred = nfs4_get_setclientid_cred(clp);
1731                 status = -ENOKEY;
1732                 if (cred == NULL)
1733                         goto out;
1734         }
1735         status = ops->renew_lease(clp, cred);
1736         put_rpccred(cred);
1737         if (status == -ETIMEDOUT) {
1738                 set_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state);
1739                 return 0;
1740         }
1741 out:
1742         return nfs4_recovery_handle_error(clp, status);
1743 }
1744
1745 /* Set NFS4CLNT_LEASE_EXPIRED and reclaim reboot state for all v4.0 errors
1746  * and for recoverable errors on EXCHANGE_ID for v4.1
1747  */
1748 static int nfs4_handle_reclaim_lease_error(struct nfs_client *clp, int status)
1749 {
1750         switch (status) {
1751         case -NFS4ERR_SEQ_MISORDERED:
1752                 if (test_and_set_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state))
1753                         return -ESERVERFAULT;
1754                 /* Lease confirmation error: retry after purging the lease */
1755                 ssleep(1);
1756                 clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
1757                 break;
1758         case -NFS4ERR_STALE_CLIENTID:
1759                 clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
1760                 nfs4_state_clear_reclaim_reboot(clp);
1761                 nfs4_state_start_reclaim_reboot(clp);
1762                 break;
1763         case -NFS4ERR_CLID_INUSE:
1764                 pr_err("NFS: Server %s reports our clientid is in use\n",
1765                         clp->cl_hostname);
1766                 nfs_mark_client_ready(clp, -EPERM);
1767                 clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
1768                 return -EPERM;
1769         case -EACCES:
1770         case -NFS4ERR_DELAY:
1771         case -ETIMEDOUT:
1772         case -EAGAIN:
1773                 ssleep(1);
1774                 break;
1775
1776         case -NFS4ERR_MINOR_VERS_MISMATCH:
1777                 if (clp->cl_cons_state == NFS_CS_SESSION_INITING)
1778                         nfs_mark_client_ready(clp, -EPROTONOSUPPORT);
1779                 dprintk("%s: exit with error %d for server %s\n",
1780                                 __func__, -EPROTONOSUPPORT, clp->cl_hostname);
1781                 return -EPROTONOSUPPORT;
1782         case -NFS4ERR_NOT_SAME: /* FixMe: implement recovery
1783                                  * in nfs4_exchange_id */
1784         default:
1785                 dprintk("%s: exit with error %d for server %s\n", __func__,
1786                                 status, clp->cl_hostname);
1787                 return status;
1788         }
1789         set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
1790         dprintk("%s: handled error %d for server %s\n", __func__, status,
1791                         clp->cl_hostname);
1792         return 0;
1793 }
1794
1795 static int nfs4_establish_lease(struct nfs_client *clp)
1796 {
1797         struct rpc_cred *cred;
1798         const struct nfs4_state_recovery_ops *ops =
1799                 clp->cl_mvops->reboot_recovery_ops;
1800         int status;
1801
1802         cred = ops->get_clid_cred(clp);
1803         if (cred == NULL)
1804                 return -ENOENT;
1805         status = ops->establish_clid(clp, cred);
1806         put_rpccred(cred);
1807         if (status != 0)
1808                 return status;
1809         pnfs_destroy_all_layouts(clp);
1810         return 0;
1811 }
1812
1813 /*
1814  * Returns zero or a negative errno.  NFS4ERR values are converted
1815  * to local errno values.
1816  */
1817 static int nfs4_reclaim_lease(struct nfs_client *clp)
1818 {
1819         int status;
1820
1821         status = nfs4_establish_lease(clp);
1822         if (status < 0)
1823                 return nfs4_handle_reclaim_lease_error(clp, status);
1824         if (test_and_clear_bit(NFS4CLNT_SERVER_SCOPE_MISMATCH, &clp->cl_state))
1825                 nfs4_state_start_reclaim_nograce(clp);
1826         if (!test_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state))
1827                 set_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state);
1828         clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state);
1829         clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
1830         return 0;
1831 }
1832
1833 static int nfs4_purge_lease(struct nfs_client *clp)
1834 {
1835         int status;
1836
1837         status = nfs4_establish_lease(clp);
1838         if (status < 0)
1839                 return nfs4_handle_reclaim_lease_error(clp, status);
1840         clear_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state);
1841         set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
1842         nfs4_state_start_reclaim_nograce(clp);
1843         return 0;
1844 }
1845
1846 /**
1847  * nfs4_discover_server_trunking - Detect server IP address trunking
1848  *
1849  * @clp: nfs_client under test
1850  * @result: OUT: found nfs_client, or clp
1851  *
1852  * Returns zero or a negative errno.  If zero is returned,
1853  * an nfs_client pointer is planted in "result".
1854  *
1855  * Note: since we are invoked in process context, and
1856  * not from inside the state manager, we cannot use
1857  * nfs4_handle_reclaim_lease_error().
1858  */
1859 int nfs4_discover_server_trunking(struct nfs_client *clp,
1860                                   struct nfs_client **result)
1861 {
1862         const struct nfs4_state_recovery_ops *ops =
1863                                 clp->cl_mvops->reboot_recovery_ops;
1864         struct rpc_clnt *clnt;
1865         struct rpc_cred *cred;
1866         int i, status;
1867
1868         dprintk("NFS: %s: testing '%s'\n", __func__, clp->cl_hostname);
1869
1870         clnt = clp->cl_rpcclient;
1871         i = 0;
1872
1873         mutex_lock(&nfs_clid_init_mutex);
1874 again:
1875         status  = -ENOENT;
1876         cred = ops->get_clid_cred(clp);
1877         if (cred == NULL)
1878                 goto out_unlock;
1879
1880         status = ops->detect_trunking(clp, result, cred);
1881         put_rpccred(cred);
1882         switch (status) {
1883         case 0:
1884                 break;
1885         case -NFS4ERR_DELAY:
1886         case -ETIMEDOUT:
1887         case -EAGAIN:
1888                 ssleep(1);
1889         case -NFS4ERR_STALE_CLIENTID:
1890                 dprintk("NFS: %s after status %d, retrying\n",
1891                         __func__, status);
1892                 goto again;
1893         case -EACCES:
1894                 if (i++)
1895                         break;
1896         case -NFS4ERR_CLID_INUSE:
1897         case -NFS4ERR_WRONGSEC:
1898                 clnt = rpc_clone_client_set_auth(clnt, RPC_AUTH_UNIX);
1899                 if (IS_ERR(clnt)) {
1900                         status = PTR_ERR(clnt);
1901                         break;
1902                 }
1903                 /* Note: this is safe because we haven't yet marked the
1904                  * client as ready, so we are the only user of
1905                  * clp->cl_rpcclient
1906                  */
1907                 clnt = xchg(&clp->cl_rpcclient, clnt);
1908                 rpc_shutdown_client(clnt);
1909                 clnt = clp->cl_rpcclient;
1910                 goto again;
1911
1912         case -NFS4ERR_MINOR_VERS_MISMATCH:
1913                 status = -EPROTONOSUPPORT;
1914                 break;
1915
1916         case -EKEYEXPIRED:
1917         case -NFS4ERR_NOT_SAME: /* FixMe: implement recovery
1918                                  * in nfs4_exchange_id */
1919                 status = -EKEYEXPIRED;
1920                 break;
1921         default:
1922                 pr_warn("NFS: %s unhandled error %d. Exiting with error EIO\n",
1923                                 __func__, status);
1924                 status = -EIO;
1925         }
1926
1927 out_unlock:
1928         mutex_unlock(&nfs_clid_init_mutex);
1929         dprintk("NFS: %s: status = %d\n", __func__, status);
1930         return status;
1931 }
1932
1933 #ifdef CONFIG_NFS_V4_1
1934 void nfs4_schedule_session_recovery(struct nfs4_session *session, int err)
1935 {
1936         struct nfs_client *clp = session->clp;
1937
1938         switch (err) {
1939         default:
1940                 set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state);
1941                 break;
1942         case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
1943                 set_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state);
1944         }
1945         nfs4_schedule_lease_recovery(clp);
1946 }
1947 EXPORT_SYMBOL_GPL(nfs4_schedule_session_recovery);
1948
1949 static void nfs41_ping_server(struct nfs_client *clp)
1950 {
1951         /* Use CHECK_LEASE to ping the server with a SEQUENCE */
1952         set_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state);
1953         nfs4_schedule_state_manager(clp);
1954 }
1955
1956 void nfs41_server_notify_target_slotid_update(struct nfs_client *clp)
1957 {
1958         nfs41_ping_server(clp);
1959 }
1960
1961 void nfs41_server_notify_highest_slotid_update(struct nfs_client *clp)
1962 {
1963         nfs41_ping_server(clp);
1964 }
1965
1966 static void nfs4_reset_all_state(struct nfs_client *clp)
1967 {
1968         if (test_and_set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) == 0) {
1969                 set_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state);
1970                 clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
1971                 nfs4_state_start_reclaim_nograce(clp);
1972                 dprintk("%s: scheduling reset of all state for server %s!\n",
1973                                 __func__, clp->cl_hostname);
1974                 nfs4_schedule_state_manager(clp);
1975         }
1976 }
1977
1978 static void nfs41_handle_server_reboot(struct nfs_client *clp)
1979 {
1980         if (test_and_set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) == 0) {
1981                 nfs4_state_start_reclaim_reboot(clp);
1982                 dprintk("%s: server %s rebooted!\n", __func__,
1983                                 clp->cl_hostname);
1984                 nfs4_schedule_state_manager(clp);
1985         }
1986 }
1987
1988 static void nfs41_handle_state_revoked(struct nfs_client *clp)
1989 {
1990         nfs4_reset_all_state(clp);
1991         dprintk("%s: state revoked on server %s\n", __func__, clp->cl_hostname);
1992 }
1993
1994 static void nfs41_handle_recallable_state_revoked(struct nfs_client *clp)
1995 {
1996         /* This will need to handle layouts too */
1997         nfs_expire_all_delegations(clp);
1998         dprintk("%s: Recallable state revoked on server %s!\n", __func__,
1999                         clp->cl_hostname);
2000 }
2001
2002 static void nfs41_handle_backchannel_fault(struct nfs_client *clp)
2003 {
2004         nfs_expire_all_delegations(clp);
2005         if (test_and_set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state) == 0)
2006                 nfs4_schedule_state_manager(clp);
2007         dprintk("%s: server %s declared a backchannel fault\n", __func__,
2008                         clp->cl_hostname);
2009 }
2010
2011 static void nfs41_handle_cb_path_down(struct nfs_client *clp)
2012 {
2013         if (test_and_set_bit(NFS4CLNT_BIND_CONN_TO_SESSION,
2014                 &clp->cl_state) == 0)
2015                 nfs4_schedule_state_manager(clp);
2016 }
2017
2018 void nfs41_handle_sequence_flag_errors(struct nfs_client *clp, u32 flags)
2019 {
2020         if (!flags)
2021                 return;
2022
2023         dprintk("%s: \"%s\" (client ID %llx) flags=0x%08x\n",
2024                 __func__, clp->cl_hostname, clp->cl_clientid, flags);
2025
2026         if (flags & SEQ4_STATUS_RESTART_RECLAIM_NEEDED)
2027                 nfs41_handle_server_reboot(clp);
2028         if (flags & (SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED |
2029                             SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED |
2030                             SEQ4_STATUS_ADMIN_STATE_REVOKED |
2031                             SEQ4_STATUS_LEASE_MOVED))
2032                 nfs41_handle_state_revoked(clp);
2033         if (flags & SEQ4_STATUS_RECALLABLE_STATE_REVOKED)
2034                 nfs41_handle_recallable_state_revoked(clp);
2035         if (flags & SEQ4_STATUS_BACKCHANNEL_FAULT)
2036                 nfs41_handle_backchannel_fault(clp);
2037         else if (flags & (SEQ4_STATUS_CB_PATH_DOWN |
2038                                 SEQ4_STATUS_CB_PATH_DOWN_SESSION))
2039                 nfs41_handle_cb_path_down(clp);
2040 }
2041
2042 static int nfs4_reset_session(struct nfs_client *clp)
2043 {
2044         struct rpc_cred *cred;
2045         int status;
2046
2047         if (!nfs4_has_session(clp))
2048                 return 0;
2049         nfs4_begin_drain_session(clp);
2050         cred = nfs4_get_exchange_id_cred(clp);
2051         status = nfs4_proc_destroy_session(clp->cl_session, cred);
2052         switch (status) {
2053         case 0:
2054         case -NFS4ERR_BADSESSION:
2055         case -NFS4ERR_DEADSESSION:
2056                 break;
2057         case -NFS4ERR_BACK_CHAN_BUSY:
2058         case -NFS4ERR_DELAY:
2059                 set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state);
2060                 status = 0;
2061                 ssleep(1);
2062                 goto out;
2063         default:
2064                 status = nfs4_recovery_handle_error(clp, status);
2065                 goto out;
2066         }
2067
2068         memset(clp->cl_session->sess_id.data, 0, NFS4_MAX_SESSIONID_LEN);
2069         status = nfs4_proc_create_session(clp, cred);
2070         if (status) {
2071                 dprintk("%s: session reset failed with status %d for server %s!\n",
2072                         __func__, status, clp->cl_hostname);
2073                 status = nfs4_handle_reclaim_lease_error(clp, status);
2074                 goto out;
2075         }
2076         nfs41_finish_session_reset(clp);
2077         dprintk("%s: session reset was successful for server %s!\n",
2078                         __func__, clp->cl_hostname);
2079 out:
2080         if (cred)
2081                 put_rpccred(cred);
2082         return status;
2083 }
2084
2085 static int nfs4_bind_conn_to_session(struct nfs_client *clp)
2086 {
2087         struct rpc_cred *cred;
2088         int ret;
2089
2090         if (!nfs4_has_session(clp))
2091                 return 0;
2092         nfs4_begin_drain_session(clp);
2093         cred = nfs4_get_exchange_id_cred(clp);
2094         ret = nfs4_proc_bind_conn_to_session(clp, cred);
2095         if (cred)
2096                 put_rpccred(cred);
2097         clear_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state);
2098         switch (ret) {
2099         case 0:
2100                 dprintk("%s: bind_conn_to_session was successful for server %s!\n",
2101                         __func__, clp->cl_hostname);
2102                 break;
2103         case -NFS4ERR_DELAY:
2104                 ssleep(1);
2105                 set_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state);
2106                 break;
2107         default:
2108                 return nfs4_recovery_handle_error(clp, ret);
2109         }
2110         return 0;
2111 }
2112 #else /* CONFIG_NFS_V4_1 */
2113 static int nfs4_reset_session(struct nfs_client *clp) { return 0; }
2114 static int nfs4_end_drain_session(struct nfs_client *clp) { return 0; }
2115
2116 static int nfs4_bind_conn_to_session(struct nfs_client *clp)
2117 {
2118         return 0;
2119 }
2120 #endif /* CONFIG_NFS_V4_1 */
2121
2122 static void nfs4_state_manager(struct nfs_client *clp)
2123 {
2124         int status = 0;
2125         const char *section = "", *section_sep = "";
2126
2127         /* Ensure exclusive access to NFSv4 state */
2128         do {
2129                 if (test_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state)) {
2130                         section = "purge state";
2131                         status = nfs4_purge_lease(clp);
2132                         if (status < 0)
2133                                 goto out_error;
2134                         continue;
2135                 }
2136
2137                 if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) {
2138                         section = "lease expired";
2139                         /* We're going to have to re-establish a clientid */
2140                         status = nfs4_reclaim_lease(clp);
2141                         if (status < 0)
2142                                 goto out_error;
2143                         continue;
2144                 }
2145
2146                 /* Initialize or reset the session */
2147                 if (test_and_clear_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state)) {
2148                         section = "reset session";
2149                         status = nfs4_reset_session(clp);
2150                         if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state))
2151                                 continue;
2152                         if (status < 0)
2153                                 goto out_error;
2154                 }
2155
2156                 /* Send BIND_CONN_TO_SESSION */
2157                 if (test_and_clear_bit(NFS4CLNT_BIND_CONN_TO_SESSION,
2158                                 &clp->cl_state)) {
2159                         section = "bind conn to session";
2160                         status = nfs4_bind_conn_to_session(clp);
2161                         if (status < 0)
2162                                 goto out_error;
2163                         continue;
2164                 }
2165
2166                 if (test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
2167                         section = "check lease";
2168                         status = nfs4_check_lease(clp);
2169                         if (status < 0)
2170                                 goto out_error;
2171                         continue;
2172                 }
2173
2174                 /* First recover reboot state... */
2175                 if (test_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state)) {
2176                         section = "reclaim reboot";
2177                         status = nfs4_do_reclaim(clp,
2178                                 clp->cl_mvops->reboot_recovery_ops);
2179                         if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) ||
2180                             test_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state))
2181                                 continue;
2182                         nfs4_state_end_reclaim_reboot(clp);
2183                         if (test_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state))
2184                                 continue;
2185                         if (status < 0)
2186                                 goto out_error;
2187                 }
2188
2189                 /* Now recover expired state... */
2190                 if (test_and_clear_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state)) {
2191                         section = "reclaim nograce";
2192                         status = nfs4_do_reclaim(clp,
2193                                 clp->cl_mvops->nograce_recovery_ops);
2194                         if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) ||
2195                             test_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state) ||
2196                             test_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state))
2197                                 continue;
2198                         if (status < 0)
2199                                 goto out_error;
2200                 }
2201
2202                 nfs4_end_drain_session(clp);
2203                 if (test_and_clear_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state)) {
2204                         nfs_client_return_marked_delegations(clp);
2205                         continue;
2206                 }
2207
2208                 nfs4_clear_state_manager_bit(clp);
2209                 /* Did we race with an attempt to give us more work? */
2210                 if (clp->cl_state == 0)
2211                         break;
2212                 if (test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) != 0)
2213                         break;
2214         } while (atomic_read(&clp->cl_count) > 1);
2215         return;
2216 out_error:
2217         if (strlen(section))
2218                 section_sep = ": ";
2219         pr_warn_ratelimited("NFS: state manager%s%s failed on NFSv4 server %s"
2220                         " with error %d\n", section_sep, section,
2221                         clp->cl_hostname, -status);
2222         ssleep(1);
2223         nfs4_end_drain_session(clp);
2224         nfs4_clear_state_manager_bit(clp);
2225 }
2226
2227 static int nfs4_run_state_manager(void *ptr)
2228 {
2229         struct nfs_client *clp = ptr;
2230
2231         allow_signal(SIGKILL);
2232         nfs4_state_manager(clp);
2233         nfs_put_client(clp);
2234         module_put_and_exit(0);
2235         return 0;
2236 }
2237
2238 /*
2239  * Local variables:
2240  *  c-basic-offset: 8
2241  * End:
2242  */