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