]> Pileus Git - ~andy/linux/blob - fs/nfs/nfs4state.c
NFS: Move struct nfs_unique_id into struct nfs_seqid_counter
[~andy/linux] / 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 "nfs4_fs.h"
55 #include "callback.h"
56 #include "delegation.h"
57 #include "internal.h"
58 #include "pnfs.h"
59
60 #define OPENOWNER_POOL_SIZE     8
61
62 const nfs4_stateid zero_stateid;
63
64 static LIST_HEAD(nfs4_clientid_list);
65
66 int nfs4_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
67 {
68         struct nfs4_setclientid_res clid = {
69                 .clientid = clp->cl_clientid,
70                 .confirm = clp->cl_confirm,
71         };
72         unsigned short port;
73         int status;
74
75         if (test_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state))
76                 goto do_confirm;
77         port = nfs_callback_tcpport;
78         if (clp->cl_addr.ss_family == AF_INET6)
79                 port = nfs_callback_tcpport6;
80
81         status = nfs4_proc_setclientid(clp, NFS4_CALLBACK, port, cred, &clid);
82         if (status != 0)
83                 goto out;
84         clp->cl_clientid = clid.clientid;
85         clp->cl_confirm = clid.confirm;
86         set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
87 do_confirm:
88         status = nfs4_proc_setclientid_confirm(clp, &clid, cred);
89         if (status != 0)
90                 goto out;
91         clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
92         nfs4_schedule_state_renewal(clp);
93 out:
94         return status;
95 }
96
97 struct rpc_cred *nfs4_get_machine_cred_locked(struct nfs_client *clp)
98 {
99         struct rpc_cred *cred = NULL;
100
101         if (clp->cl_machine_cred != NULL)
102                 cred = get_rpccred(clp->cl_machine_cred);
103         return cred;
104 }
105
106 static void nfs4_clear_machine_cred(struct nfs_client *clp)
107 {
108         struct rpc_cred *cred;
109
110         spin_lock(&clp->cl_lock);
111         cred = clp->cl_machine_cred;
112         clp->cl_machine_cred = NULL;
113         spin_unlock(&clp->cl_lock);
114         if (cred != NULL)
115                 put_rpccred(cred);
116 }
117
118 static struct rpc_cred *
119 nfs4_get_renew_cred_server_locked(struct nfs_server *server)
120 {
121         struct rpc_cred *cred = NULL;
122         struct nfs4_state_owner *sp;
123         struct rb_node *pos;
124
125         for (pos = rb_first(&server->state_owners);
126              pos != NULL;
127              pos = rb_next(pos)) {
128                 sp = rb_entry(pos, struct nfs4_state_owner, so_server_node);
129                 if (list_empty(&sp->so_states))
130                         continue;
131                 cred = get_rpccred(sp->so_cred);
132                 break;
133         }
134         return cred;
135 }
136
137 /**
138  * nfs4_get_renew_cred_locked - Acquire credential for a renew operation
139  * @clp: client state handle
140  *
141  * Returns an rpc_cred with reference count bumped, or NULL.
142  * Caller must hold clp->cl_lock.
143  */
144 struct rpc_cred *nfs4_get_renew_cred_locked(struct nfs_client *clp)
145 {
146         struct rpc_cred *cred = NULL;
147         struct nfs_server *server;
148
149         rcu_read_lock();
150         list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
151                 cred = nfs4_get_renew_cred_server_locked(server);
152                 if (cred != NULL)
153                         break;
154         }
155         rcu_read_unlock();
156         return cred;
157 }
158
159 #if defined(CONFIG_NFS_V4_1)
160
161 static int nfs41_setup_state_renewal(struct nfs_client *clp)
162 {
163         int status;
164         struct nfs_fsinfo fsinfo;
165
166         if (!test_bit(NFS_CS_CHECK_LEASE_TIME, &clp->cl_res_state)) {
167                 nfs4_schedule_state_renewal(clp);
168                 return 0;
169         }
170
171         status = nfs4_proc_get_lease_time(clp, &fsinfo);
172         if (status == 0) {
173                 /* Update lease time and schedule renewal */
174                 spin_lock(&clp->cl_lock);
175                 clp->cl_lease_time = fsinfo.lease_time * HZ;
176                 clp->cl_last_renewal = jiffies;
177                 spin_unlock(&clp->cl_lock);
178
179                 nfs4_schedule_state_renewal(clp);
180         }
181
182         return status;
183 }
184
185 /*
186  * Back channel returns NFS4ERR_DELAY for new requests when
187  * NFS4_SESSION_DRAINING is set so there is no work to be done when draining
188  * is ended.
189  */
190 static void nfs4_end_drain_session(struct nfs_client *clp)
191 {
192         struct nfs4_session *ses = clp->cl_session;
193         int max_slots;
194
195         if (ses == NULL)
196                 return;
197         if (test_and_clear_bit(NFS4_SESSION_DRAINING, &ses->session_state)) {
198                 spin_lock(&ses->fc_slot_table.slot_tbl_lock);
199                 max_slots = ses->fc_slot_table.max_slots;
200                 while (max_slots--) {
201                         struct rpc_task *task;
202
203                         task = rpc_wake_up_next(&ses->fc_slot_table.
204                                                 slot_tbl_waitq);
205                         if (!task)
206                                 break;
207                         rpc_task_set_priority(task, RPC_PRIORITY_PRIVILEGED);
208                 }
209                 spin_unlock(&ses->fc_slot_table.slot_tbl_lock);
210         }
211 }
212
213 static int nfs4_wait_on_slot_tbl(struct nfs4_slot_table *tbl)
214 {
215         spin_lock(&tbl->slot_tbl_lock);
216         if (tbl->highest_used_slotid != -1) {
217                 INIT_COMPLETION(tbl->complete);
218                 spin_unlock(&tbl->slot_tbl_lock);
219                 return wait_for_completion_interruptible(&tbl->complete);
220         }
221         spin_unlock(&tbl->slot_tbl_lock);
222         return 0;
223 }
224
225 static int nfs4_begin_drain_session(struct nfs_client *clp)
226 {
227         struct nfs4_session *ses = clp->cl_session;
228         int ret = 0;
229
230         set_bit(NFS4_SESSION_DRAINING, &ses->session_state);
231         /* back channel */
232         ret = nfs4_wait_on_slot_tbl(&ses->bc_slot_table);
233         if (ret)
234                 return ret;
235         /* fore channel */
236         return nfs4_wait_on_slot_tbl(&ses->fc_slot_table);
237 }
238
239 int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred)
240 {
241         int status;
242
243         if (test_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state))
244                 goto do_confirm;
245         nfs4_begin_drain_session(clp);
246         status = nfs4_proc_exchange_id(clp, cred);
247         if (status != 0)
248                 goto out;
249         set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
250 do_confirm:
251         status = nfs4_proc_create_session(clp);
252         if (status != 0)
253                 goto out;
254         clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
255         nfs41_setup_state_renewal(clp);
256         nfs_mark_client_ready(clp, NFS_CS_READY);
257 out:
258         return status;
259 }
260
261 struct rpc_cred *nfs4_get_exchange_id_cred(struct nfs_client *clp)
262 {
263         struct rpc_cred *cred;
264
265         spin_lock(&clp->cl_lock);
266         cred = nfs4_get_machine_cred_locked(clp);
267         spin_unlock(&clp->cl_lock);
268         return cred;
269 }
270
271 #endif /* CONFIG_NFS_V4_1 */
272
273 static struct rpc_cred *
274 nfs4_get_setclientid_cred_server(struct nfs_server *server)
275 {
276         struct nfs_client *clp = server->nfs_client;
277         struct rpc_cred *cred = NULL;
278         struct nfs4_state_owner *sp;
279         struct rb_node *pos;
280
281         spin_lock(&clp->cl_lock);
282         pos = rb_first(&server->state_owners);
283         if (pos != NULL) {
284                 sp = rb_entry(pos, struct nfs4_state_owner, so_server_node);
285                 cred = get_rpccred(sp->so_cred);
286         }
287         spin_unlock(&clp->cl_lock);
288         return cred;
289 }
290
291 /**
292  * nfs4_get_setclientid_cred - Acquire credential for a setclientid operation
293  * @clp: client state handle
294  *
295  * Returns an rpc_cred with reference count bumped, or NULL.
296  */
297 struct rpc_cred *nfs4_get_setclientid_cred(struct nfs_client *clp)
298 {
299         struct nfs_server *server;
300         struct rpc_cred *cred;
301
302         spin_lock(&clp->cl_lock);
303         cred = nfs4_get_machine_cred_locked(clp);
304         spin_unlock(&clp->cl_lock);
305         if (cred != NULL)
306                 goto out;
307
308         rcu_read_lock();
309         list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
310                 cred = nfs4_get_setclientid_cred_server(server);
311                 if (cred != NULL)
312                         break;
313         }
314         rcu_read_unlock();
315
316 out:
317         return cred;
318 }
319
320 static struct nfs4_state_owner *
321 nfs4_find_state_owner_locked(struct nfs_server *server, struct rpc_cred *cred)
322 {
323         struct rb_node **p = &server->state_owners.rb_node,
324                        *parent = NULL;
325         struct nfs4_state_owner *sp;
326
327         while (*p != NULL) {
328                 parent = *p;
329                 sp = rb_entry(parent, struct nfs4_state_owner, so_server_node);
330
331                 if (cred < sp->so_cred)
332                         p = &parent->rb_left;
333                 else if (cred > sp->so_cred)
334                         p = &parent->rb_right;
335                 else {
336                         if (!list_empty(&sp->so_lru))
337                                 list_del_init(&sp->so_lru);
338                         atomic_inc(&sp->so_count);
339                         return sp;
340                 }
341         }
342         return NULL;
343 }
344
345 static struct nfs4_state_owner *
346 nfs4_insert_state_owner_locked(struct nfs4_state_owner *new)
347 {
348         struct nfs_server *server = new->so_server;
349         struct rb_node **p = &server->state_owners.rb_node,
350                        *parent = NULL;
351         struct nfs4_state_owner *sp;
352         int err;
353
354         while (*p != NULL) {
355                 parent = *p;
356                 sp = rb_entry(parent, struct nfs4_state_owner, so_server_node);
357
358                 if (new->so_cred < sp->so_cred)
359                         p = &parent->rb_left;
360                 else if (new->so_cred > sp->so_cred)
361                         p = &parent->rb_right;
362                 else {
363                         if (!list_empty(&sp->so_lru))
364                                 list_del_init(&sp->so_lru);
365                         atomic_inc(&sp->so_count);
366                         return sp;
367                 }
368         }
369         err = ida_get_new(&server->openowner_id, &new->so_seqid.owner_id);
370         if (err)
371                 return ERR_PTR(err);
372         rb_link_node(&new->so_server_node, parent, p);
373         rb_insert_color(&new->so_server_node, &server->state_owners);
374         return new;
375 }
376
377 static void
378 nfs4_remove_state_owner_locked(struct nfs4_state_owner *sp)
379 {
380         struct nfs_server *server = sp->so_server;
381
382         if (!RB_EMPTY_NODE(&sp->so_server_node))
383                 rb_erase(&sp->so_server_node, &server->state_owners);
384         ida_remove(&server->openowner_id, sp->so_seqid.owner_id);
385 }
386
387 static void
388 nfs4_init_seqid_counter(struct nfs_seqid_counter *sc)
389 {
390         sc->flags = 0;
391         sc->counter = 0;
392         spin_lock_init(&sc->lock);
393         INIT_LIST_HEAD(&sc->list);
394         rpc_init_wait_queue(&sc->wait, "Seqid_waitqueue");
395 }
396
397 static void
398 nfs4_destroy_seqid_counter(struct nfs_seqid_counter *sc)
399 {
400         rpc_destroy_wait_queue(&sc->wait);
401 }
402
403 /*
404  * nfs4_alloc_state_owner(): this is called on the OPEN or CREATE path to
405  * create a new state_owner.
406  *
407  */
408 static struct nfs4_state_owner *
409 nfs4_alloc_state_owner(struct nfs_server *server,
410                 struct rpc_cred *cred,
411                 gfp_t gfp_flags)
412 {
413         struct nfs4_state_owner *sp;
414
415         sp = kzalloc(sizeof(*sp), gfp_flags);
416         if (!sp)
417                 return NULL;
418         sp->so_server = server;
419         sp->so_cred = get_rpccred(cred);
420         spin_lock_init(&sp->so_lock);
421         INIT_LIST_HEAD(&sp->so_states);
422         nfs4_init_seqid_counter(&sp->so_seqid);
423         atomic_set(&sp->so_count, 1);
424         INIT_LIST_HEAD(&sp->so_lru);
425         return sp;
426 }
427
428 static void
429 nfs4_drop_state_owner(struct nfs4_state_owner *sp)
430 {
431         if (!RB_EMPTY_NODE(&sp->so_server_node)) {
432                 struct nfs_server *server = sp->so_server;
433                 struct nfs_client *clp = server->nfs_client;
434
435                 spin_lock(&clp->cl_lock);
436                 rb_erase(&sp->so_server_node, &server->state_owners);
437                 RB_CLEAR_NODE(&sp->so_server_node);
438                 spin_unlock(&clp->cl_lock);
439         }
440 }
441
442 static void nfs4_free_state_owner(struct nfs4_state_owner *sp)
443 {
444         nfs4_destroy_seqid_counter(&sp->so_seqid);
445         put_rpccred(sp->so_cred);
446         kfree(sp);
447 }
448
449 static void nfs4_gc_state_owners(struct nfs_server *server)
450 {
451         struct nfs_client *clp = server->nfs_client;
452         struct nfs4_state_owner *sp, *tmp;
453         unsigned long time_min, time_max;
454         LIST_HEAD(doomed);
455
456         spin_lock(&clp->cl_lock);
457         time_max = jiffies;
458         time_min = (long)time_max - (long)clp->cl_lease_time;
459         list_for_each_entry_safe(sp, tmp, &server->state_owners_lru, so_lru) {
460                 /* NB: LRU is sorted so that oldest is at the head */
461                 if (time_in_range(sp->so_expires, time_min, time_max))
462                         break;
463                 list_move(&sp->so_lru, &doomed);
464                 nfs4_remove_state_owner_locked(sp);
465         }
466         spin_unlock(&clp->cl_lock);
467
468         list_for_each_entry_safe(sp, tmp, &doomed, so_lru) {
469                 list_del(&sp->so_lru);
470                 nfs4_free_state_owner(sp);
471         }
472 }
473
474 /**
475  * nfs4_get_state_owner - Look up a state owner given a credential
476  * @server: nfs_server to search
477  * @cred: RPC credential to match
478  *
479  * Returns a pointer to an instantiated nfs4_state_owner struct, or NULL.
480  */
481 struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *server,
482                                               struct rpc_cred *cred,
483                                               gfp_t gfp_flags)
484 {
485         struct nfs_client *clp = server->nfs_client;
486         struct nfs4_state_owner *sp, *new;
487
488         spin_lock(&clp->cl_lock);
489         sp = nfs4_find_state_owner_locked(server, cred);
490         spin_unlock(&clp->cl_lock);
491         if (sp != NULL)
492                 goto out;
493         new = nfs4_alloc_state_owner(server, cred, gfp_flags);
494         if (new == NULL)
495                 goto out;
496         do {
497                 if (ida_pre_get(&server->openowner_id, gfp_flags) == 0)
498                         break;
499                 spin_lock(&clp->cl_lock);
500                 sp = nfs4_insert_state_owner_locked(new);
501                 spin_unlock(&clp->cl_lock);
502         } while (sp == ERR_PTR(-EAGAIN));
503         if (sp != new)
504                 nfs4_free_state_owner(new);
505 out:
506         nfs4_gc_state_owners(server);
507         return sp;
508 }
509
510 /**
511  * nfs4_put_state_owner - Release a nfs4_state_owner
512  * @sp: state owner data to release
513  */
514 void nfs4_put_state_owner(struct nfs4_state_owner *sp)
515 {
516         struct nfs_server *server = sp->so_server;
517         struct nfs_client *clp = server->nfs_client;
518
519         if (!atomic_dec_and_lock(&sp->so_count, &clp->cl_lock))
520                 return;
521
522         if (!RB_EMPTY_NODE(&sp->so_server_node)) {
523                 sp->so_expires = jiffies;
524                 list_add_tail(&sp->so_lru, &server->state_owners_lru);
525                 spin_unlock(&clp->cl_lock);
526         } else {
527                 nfs4_remove_state_owner_locked(sp);
528                 spin_unlock(&clp->cl_lock);
529                 nfs4_free_state_owner(sp);
530         }
531 }
532
533 /**
534  * nfs4_purge_state_owners - Release all cached state owners
535  * @server: nfs_server with cached state owners to release
536  *
537  * Called at umount time.  Remaining state owners will be on
538  * the LRU with ref count of zero.
539  */
540 void nfs4_purge_state_owners(struct nfs_server *server)
541 {
542         struct nfs_client *clp = server->nfs_client;
543         struct nfs4_state_owner *sp, *tmp;
544         LIST_HEAD(doomed);
545
546         spin_lock(&clp->cl_lock);
547         list_for_each_entry_safe(sp, tmp, &server->state_owners_lru, so_lru) {
548                 list_move(&sp->so_lru, &doomed);
549                 nfs4_remove_state_owner_locked(sp);
550         }
551         spin_unlock(&clp->cl_lock);
552
553         list_for_each_entry_safe(sp, tmp, &doomed, so_lru) {
554                 list_del(&sp->so_lru);
555                 nfs4_free_state_owner(sp);
556         }
557 }
558
559 static struct nfs4_state *
560 nfs4_alloc_open_state(void)
561 {
562         struct nfs4_state *state;
563
564         state = kzalloc(sizeof(*state), GFP_NOFS);
565         if (!state)
566                 return NULL;
567         atomic_set(&state->count, 1);
568         INIT_LIST_HEAD(&state->lock_states);
569         spin_lock_init(&state->state_lock);
570         seqlock_init(&state->seqlock);
571         return state;
572 }
573
574 void
575 nfs4_state_set_mode_locked(struct nfs4_state *state, fmode_t fmode)
576 {
577         if (state->state == fmode)
578                 return;
579         /* NB! List reordering - see the reclaim code for why.  */
580         if ((fmode & FMODE_WRITE) != (state->state & FMODE_WRITE)) {
581                 if (fmode & FMODE_WRITE)
582                         list_move(&state->open_states, &state->owner->so_states);
583                 else
584                         list_move_tail(&state->open_states, &state->owner->so_states);
585         }
586         state->state = fmode;
587 }
588
589 static struct nfs4_state *
590 __nfs4_find_state_byowner(struct inode *inode, struct nfs4_state_owner *owner)
591 {
592         struct nfs_inode *nfsi = NFS_I(inode);
593         struct nfs4_state *state;
594
595         list_for_each_entry(state, &nfsi->open_states, inode_states) {
596                 if (state->owner != owner)
597                         continue;
598                 if (atomic_inc_not_zero(&state->count))
599                         return state;
600         }
601         return NULL;
602 }
603
604 static void
605 nfs4_free_open_state(struct nfs4_state *state)
606 {
607         kfree(state);
608 }
609
610 struct nfs4_state *
611 nfs4_get_open_state(struct inode *inode, struct nfs4_state_owner *owner)
612 {
613         struct nfs4_state *state, *new;
614         struct nfs_inode *nfsi = NFS_I(inode);
615
616         spin_lock(&inode->i_lock);
617         state = __nfs4_find_state_byowner(inode, owner);
618         spin_unlock(&inode->i_lock);
619         if (state)
620                 goto out;
621         new = nfs4_alloc_open_state();
622         spin_lock(&owner->so_lock);
623         spin_lock(&inode->i_lock);
624         state = __nfs4_find_state_byowner(inode, owner);
625         if (state == NULL && new != NULL) {
626                 state = new;
627                 state->owner = owner;
628                 atomic_inc(&owner->so_count);
629                 list_add(&state->inode_states, &nfsi->open_states);
630                 ihold(inode);
631                 state->inode = inode;
632                 spin_unlock(&inode->i_lock);
633                 /* Note: The reclaim code dictates that we add stateless
634                  * and read-only stateids to the end of the list */
635                 list_add_tail(&state->open_states, &owner->so_states);
636                 spin_unlock(&owner->so_lock);
637         } else {
638                 spin_unlock(&inode->i_lock);
639                 spin_unlock(&owner->so_lock);
640                 if (new)
641                         nfs4_free_open_state(new);
642         }
643 out:
644         return state;
645 }
646
647 void nfs4_put_open_state(struct nfs4_state *state)
648 {
649         struct inode *inode = state->inode;
650         struct nfs4_state_owner *owner = state->owner;
651
652         if (!atomic_dec_and_lock(&state->count, &owner->so_lock))
653                 return;
654         spin_lock(&inode->i_lock);
655         list_del(&state->inode_states);
656         list_del(&state->open_states);
657         spin_unlock(&inode->i_lock);
658         spin_unlock(&owner->so_lock);
659         iput(inode);
660         nfs4_free_open_state(state);
661         nfs4_put_state_owner(owner);
662 }
663
664 /*
665  * Close the current file.
666  */
667 static void __nfs4_close(struct nfs4_state *state,
668                 fmode_t fmode, gfp_t gfp_mask, int wait)
669 {
670         struct nfs4_state_owner *owner = state->owner;
671         int call_close = 0;
672         fmode_t newstate;
673
674         atomic_inc(&owner->so_count);
675         /* Protect against nfs4_find_state() */
676         spin_lock(&owner->so_lock);
677         switch (fmode & (FMODE_READ | FMODE_WRITE)) {
678                 case FMODE_READ:
679                         state->n_rdonly--;
680                         break;
681                 case FMODE_WRITE:
682                         state->n_wronly--;
683                         break;
684                 case FMODE_READ|FMODE_WRITE:
685                         state->n_rdwr--;
686         }
687         newstate = FMODE_READ|FMODE_WRITE;
688         if (state->n_rdwr == 0) {
689                 if (state->n_rdonly == 0) {
690                         newstate &= ~FMODE_READ;
691                         call_close |= test_bit(NFS_O_RDONLY_STATE, &state->flags);
692                         call_close |= test_bit(NFS_O_RDWR_STATE, &state->flags);
693                 }
694                 if (state->n_wronly == 0) {
695                         newstate &= ~FMODE_WRITE;
696                         call_close |= test_bit(NFS_O_WRONLY_STATE, &state->flags);
697                         call_close |= test_bit(NFS_O_RDWR_STATE, &state->flags);
698                 }
699                 if (newstate == 0)
700                         clear_bit(NFS_DELEGATED_STATE, &state->flags);
701         }
702         nfs4_state_set_mode_locked(state, newstate);
703         spin_unlock(&owner->so_lock);
704
705         if (!call_close) {
706                 nfs4_put_open_state(state);
707                 nfs4_put_state_owner(owner);
708         } else {
709                 bool roc = pnfs_roc(state->inode);
710
711                 nfs4_do_close(state, gfp_mask, wait, roc);
712         }
713 }
714
715 void nfs4_close_state(struct nfs4_state *state, fmode_t fmode)
716 {
717         __nfs4_close(state, fmode, GFP_NOFS, 0);
718 }
719
720 void nfs4_close_sync(struct nfs4_state *state, fmode_t fmode)
721 {
722         __nfs4_close(state, fmode, GFP_KERNEL, 1);
723 }
724
725 /*
726  * Search the state->lock_states for an existing lock_owner
727  * that is compatible with current->files
728  */
729 static struct nfs4_lock_state *
730 __nfs4_find_lock_state(struct nfs4_state *state, fl_owner_t fl_owner, pid_t fl_pid, unsigned int type)
731 {
732         struct nfs4_lock_state *pos;
733         list_for_each_entry(pos, &state->lock_states, ls_locks) {
734                 if (type != NFS4_ANY_LOCK_TYPE && pos->ls_owner.lo_type != type)
735                         continue;
736                 switch (pos->ls_owner.lo_type) {
737                 case NFS4_POSIX_LOCK_TYPE:
738                         if (pos->ls_owner.lo_u.posix_owner != fl_owner)
739                                 continue;
740                         break;
741                 case NFS4_FLOCK_LOCK_TYPE:
742                         if (pos->ls_owner.lo_u.flock_owner != fl_pid)
743                                 continue;
744                 }
745                 atomic_inc(&pos->ls_count);
746                 return pos;
747         }
748         return NULL;
749 }
750
751 /*
752  * Return a compatible lock_state. If no initialized lock_state structure
753  * exists, return an uninitialized one.
754  *
755  */
756 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)
757 {
758         struct nfs4_lock_state *lsp;
759         struct nfs_server *server = state->owner->so_server;
760
761         lsp = kzalloc(sizeof(*lsp), GFP_NOFS);
762         if (lsp == NULL)
763                 return NULL;
764         nfs4_init_seqid_counter(&lsp->ls_seqid);
765         atomic_set(&lsp->ls_count, 1);
766         lsp->ls_state = state;
767         lsp->ls_owner.lo_type = type;
768         switch (lsp->ls_owner.lo_type) {
769         case NFS4_FLOCK_LOCK_TYPE:
770                 lsp->ls_owner.lo_u.flock_owner = fl_pid;
771                 break;
772         case NFS4_POSIX_LOCK_TYPE:
773                 lsp->ls_owner.lo_u.posix_owner = fl_owner;
774                 break;
775         default:
776                 goto out_free;
777         }
778         lsp->ls_seqid.owner_id = ida_simple_get(&server->lockowner_id, 0, 0, GFP_NOFS);
779         if (lsp->ls_seqid.owner_id < 0)
780                 goto out_free;
781         INIT_LIST_HEAD(&lsp->ls_locks);
782         return lsp;
783 out_free:
784         kfree(lsp);
785         return NULL;
786 }
787
788 static void nfs4_free_lock_state(struct nfs4_lock_state *lsp)
789 {
790         struct nfs_server *server = lsp->ls_state->owner->so_server;
791
792         ida_simple_remove(&server->lockowner_id, lsp->ls_seqid.owner_id);
793         nfs4_destroy_seqid_counter(&lsp->ls_seqid);
794         kfree(lsp);
795 }
796
797 /*
798  * Return a compatible lock_state. If no initialized lock_state structure
799  * exists, return an uninitialized one.
800  *
801  */
802 static struct nfs4_lock_state *nfs4_get_lock_state(struct nfs4_state *state, fl_owner_t owner, pid_t pid, unsigned int type)
803 {
804         struct nfs4_lock_state *lsp, *new = NULL;
805         
806         for(;;) {
807                 spin_lock(&state->state_lock);
808                 lsp = __nfs4_find_lock_state(state, owner, pid, type);
809                 if (lsp != NULL)
810                         break;
811                 if (new != NULL) {
812                         list_add(&new->ls_locks, &state->lock_states);
813                         set_bit(LK_STATE_IN_USE, &state->flags);
814                         lsp = new;
815                         new = NULL;
816                         break;
817                 }
818                 spin_unlock(&state->state_lock);
819                 new = nfs4_alloc_lock_state(state, owner, pid, type);
820                 if (new == NULL)
821                         return NULL;
822         }
823         spin_unlock(&state->state_lock);
824         if (new != NULL)
825                 nfs4_free_lock_state(new);
826         return lsp;
827 }
828
829 /*
830  * Release reference to lock_state, and free it if we see that
831  * it is no longer in use
832  */
833 void nfs4_put_lock_state(struct nfs4_lock_state *lsp)
834 {
835         struct nfs4_state *state;
836
837         if (lsp == NULL)
838                 return;
839         state = lsp->ls_state;
840         if (!atomic_dec_and_lock(&lsp->ls_count, &state->state_lock))
841                 return;
842         list_del(&lsp->ls_locks);
843         if (list_empty(&state->lock_states))
844                 clear_bit(LK_STATE_IN_USE, &state->flags);
845         spin_unlock(&state->state_lock);
846         if (lsp->ls_flags & NFS_LOCK_INITIALIZED)
847                 nfs4_release_lockowner(lsp);
848         nfs4_free_lock_state(lsp);
849 }
850
851 static void nfs4_fl_copy_lock(struct file_lock *dst, struct file_lock *src)
852 {
853         struct nfs4_lock_state *lsp = src->fl_u.nfs4_fl.owner;
854
855         dst->fl_u.nfs4_fl.owner = lsp;
856         atomic_inc(&lsp->ls_count);
857 }
858
859 static void nfs4_fl_release_lock(struct file_lock *fl)
860 {
861         nfs4_put_lock_state(fl->fl_u.nfs4_fl.owner);
862 }
863
864 static const struct file_lock_operations nfs4_fl_lock_ops = {
865         .fl_copy_lock = nfs4_fl_copy_lock,
866         .fl_release_private = nfs4_fl_release_lock,
867 };
868
869 int nfs4_set_lock_state(struct nfs4_state *state, struct file_lock *fl)
870 {
871         struct nfs4_lock_state *lsp;
872
873         if (fl->fl_ops != NULL)
874                 return 0;
875         if (fl->fl_flags & FL_POSIX)
876                 lsp = nfs4_get_lock_state(state, fl->fl_owner, 0, NFS4_POSIX_LOCK_TYPE);
877         else if (fl->fl_flags & FL_FLOCK)
878                 lsp = nfs4_get_lock_state(state, 0, fl->fl_pid, NFS4_FLOCK_LOCK_TYPE);
879         else
880                 return -EINVAL;
881         if (lsp == NULL)
882                 return -ENOMEM;
883         fl->fl_u.nfs4_fl.owner = lsp;
884         fl->fl_ops = &nfs4_fl_lock_ops;
885         return 0;
886 }
887
888 /*
889  * Byte-range lock aware utility to initialize the stateid of read/write
890  * requests.
891  */
892 void nfs4_copy_stateid(nfs4_stateid *dst, struct nfs4_state *state, fl_owner_t fl_owner, pid_t fl_pid)
893 {
894         struct nfs4_lock_state *lsp;
895         int seq;
896
897         do {
898                 seq = read_seqbegin(&state->seqlock);
899                 memcpy(dst, &state->stateid, sizeof(*dst));
900         } while (read_seqretry(&state->seqlock, seq));
901         if (test_bit(LK_STATE_IN_USE, &state->flags) == 0)
902                 return;
903
904         spin_lock(&state->state_lock);
905         lsp = __nfs4_find_lock_state(state, fl_owner, fl_pid, NFS4_ANY_LOCK_TYPE);
906         if (lsp != NULL && (lsp->ls_flags & NFS_LOCK_INITIALIZED) != 0)
907                 memcpy(dst, &lsp->ls_stateid, sizeof(*dst));
908         spin_unlock(&state->state_lock);
909         nfs4_put_lock_state(lsp);
910 }
911
912 struct nfs_seqid *nfs_alloc_seqid(struct nfs_seqid_counter *counter, gfp_t gfp_mask)
913 {
914         struct nfs_seqid *new;
915
916         new = kmalloc(sizeof(*new), gfp_mask);
917         if (new != NULL) {
918                 new->sequence = counter;
919                 INIT_LIST_HEAD(&new->list);
920         }
921         return new;
922 }
923
924 void nfs_release_seqid(struct nfs_seqid *seqid)
925 {
926         if (!list_empty(&seqid->list)) {
927                 struct nfs_seqid_counter *sequence = seqid->sequence;
928
929                 spin_lock(&sequence->lock);
930                 list_del_init(&seqid->list);
931                 spin_unlock(&sequence->lock);
932                 rpc_wake_up(&sequence->wait);
933         }
934 }
935
936 void nfs_free_seqid(struct nfs_seqid *seqid)
937 {
938         nfs_release_seqid(seqid);
939         kfree(seqid);
940 }
941
942 /*
943  * Increment the seqid if the OPEN/OPEN_DOWNGRADE/CLOSE succeeded, or
944  * failed with a seqid incrementing error -
945  * see comments nfs_fs.h:seqid_mutating_error()
946  */
947 static void nfs_increment_seqid(int status, struct nfs_seqid *seqid)
948 {
949         BUG_ON(list_first_entry(&seqid->sequence->list, struct nfs_seqid, list) != seqid);
950         switch (status) {
951                 case 0:
952                         break;
953                 case -NFS4ERR_BAD_SEQID:
954                         if (seqid->sequence->flags & NFS_SEQID_CONFIRMED)
955                                 return;
956                         printk(KERN_WARNING "NFS: v4 server returned a bad"
957                                         " sequence-id error on an"
958                                         " unconfirmed sequence %p!\n",
959                                         seqid->sequence);
960                 case -NFS4ERR_STALE_CLIENTID:
961                 case -NFS4ERR_STALE_STATEID:
962                 case -NFS4ERR_BAD_STATEID:
963                 case -NFS4ERR_BADXDR:
964                 case -NFS4ERR_RESOURCE:
965                 case -NFS4ERR_NOFILEHANDLE:
966                         /* Non-seqid mutating errors */
967                         return;
968         };
969         /*
970          * Note: no locking needed as we are guaranteed to be first
971          * on the sequence list
972          */
973         seqid->sequence->counter++;
974 }
975
976 void nfs_increment_open_seqid(int status, struct nfs_seqid *seqid)
977 {
978         struct nfs4_state_owner *sp = container_of(seqid->sequence,
979                                         struct nfs4_state_owner, so_seqid);
980         struct nfs_server *server = sp->so_server;
981
982         if (status == -NFS4ERR_BAD_SEQID)
983                 nfs4_drop_state_owner(sp);
984         if (!nfs4_has_session(server->nfs_client))
985                 nfs_increment_seqid(status, seqid);
986 }
987
988 /*
989  * Increment the seqid if the LOCK/LOCKU succeeded, or
990  * failed with a seqid incrementing error -
991  * see comments nfs_fs.h:seqid_mutating_error()
992  */
993 void nfs_increment_lock_seqid(int status, struct nfs_seqid *seqid)
994 {
995         nfs_increment_seqid(status, seqid);
996 }
997
998 int nfs_wait_on_sequence(struct nfs_seqid *seqid, struct rpc_task *task)
999 {
1000         struct nfs_seqid_counter *sequence = seqid->sequence;
1001         int status = 0;
1002
1003         spin_lock(&sequence->lock);
1004         if (list_empty(&seqid->list))
1005                 list_add_tail(&seqid->list, &sequence->list);
1006         if (list_first_entry(&sequence->list, struct nfs_seqid, list) == seqid)
1007                 goto unlock;
1008         rpc_sleep_on(&sequence->wait, task, NULL);
1009         status = -EAGAIN;
1010 unlock:
1011         spin_unlock(&sequence->lock);
1012         return status;
1013 }
1014
1015 static int nfs4_run_state_manager(void *);
1016
1017 static void nfs4_clear_state_manager_bit(struct nfs_client *clp)
1018 {
1019         smp_mb__before_clear_bit();
1020         clear_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state);
1021         smp_mb__after_clear_bit();
1022         wake_up_bit(&clp->cl_state, NFS4CLNT_MANAGER_RUNNING);
1023         rpc_wake_up(&clp->cl_rpcwaitq);
1024 }
1025
1026 /*
1027  * Schedule the nfs_client asynchronous state management routine
1028  */
1029 void nfs4_schedule_state_manager(struct nfs_client *clp)
1030 {
1031         struct task_struct *task;
1032
1033         if (test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) != 0)
1034                 return;
1035         __module_get(THIS_MODULE);
1036         atomic_inc(&clp->cl_count);
1037         task = kthread_run(nfs4_run_state_manager, clp, "%s-manager",
1038                                 rpc_peeraddr2str(clp->cl_rpcclient,
1039                                                         RPC_DISPLAY_ADDR));
1040         if (!IS_ERR(task))
1041                 return;
1042         nfs4_clear_state_manager_bit(clp);
1043         nfs_put_client(clp);
1044         module_put(THIS_MODULE);
1045 }
1046
1047 /*
1048  * Schedule a lease recovery attempt
1049  */
1050 void nfs4_schedule_lease_recovery(struct nfs_client *clp)
1051 {
1052         if (!clp)
1053                 return;
1054         if (!test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state))
1055                 set_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state);
1056         nfs4_schedule_state_manager(clp);
1057 }
1058
1059 void nfs4_schedule_path_down_recovery(struct nfs_client *clp)
1060 {
1061         nfs_handle_cb_pathdown(clp);
1062         nfs4_schedule_state_manager(clp);
1063 }
1064
1065 static int nfs4_state_mark_reclaim_reboot(struct nfs_client *clp, struct nfs4_state *state)
1066 {
1067
1068         set_bit(NFS_STATE_RECLAIM_REBOOT, &state->flags);
1069         /* Don't recover state that expired before the reboot */
1070         if (test_bit(NFS_STATE_RECLAIM_NOGRACE, &state->flags)) {
1071                 clear_bit(NFS_STATE_RECLAIM_REBOOT, &state->flags);
1072                 return 0;
1073         }
1074         set_bit(NFS_OWNER_RECLAIM_REBOOT, &state->owner->so_flags);
1075         set_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state);
1076         return 1;
1077 }
1078
1079 static int nfs4_state_mark_reclaim_nograce(struct nfs_client *clp, struct nfs4_state *state)
1080 {
1081         set_bit(NFS_STATE_RECLAIM_NOGRACE, &state->flags);
1082         clear_bit(NFS_STATE_RECLAIM_REBOOT, &state->flags);
1083         set_bit(NFS_OWNER_RECLAIM_NOGRACE, &state->owner->so_flags);
1084         set_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state);
1085         return 1;
1086 }
1087
1088 void nfs4_schedule_stateid_recovery(const struct nfs_server *server, struct nfs4_state *state)
1089 {
1090         struct nfs_client *clp = server->nfs_client;
1091
1092         nfs4_state_mark_reclaim_nograce(clp, state);
1093         nfs4_schedule_state_manager(clp);
1094 }
1095
1096 static int nfs4_reclaim_locks(struct nfs4_state *state, const struct nfs4_state_recovery_ops *ops)
1097 {
1098         struct inode *inode = state->inode;
1099         struct nfs_inode *nfsi = NFS_I(inode);
1100         struct file_lock *fl;
1101         int status = 0;
1102
1103         if (inode->i_flock == NULL)
1104                 return 0;
1105
1106         /* Guard against delegation returns and new lock/unlock calls */
1107         down_write(&nfsi->rwsem);
1108         /* Protect inode->i_flock using the BKL */
1109         lock_flocks();
1110         for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
1111                 if (!(fl->fl_flags & (FL_POSIX|FL_FLOCK)))
1112                         continue;
1113                 if (nfs_file_open_context(fl->fl_file)->state != state)
1114                         continue;
1115                 unlock_flocks();
1116                 status = ops->recover_lock(state, fl);
1117                 switch (status) {
1118                         case 0:
1119                                 break;
1120                         case -ESTALE:
1121                         case -NFS4ERR_ADMIN_REVOKED:
1122                         case -NFS4ERR_STALE_STATEID:
1123                         case -NFS4ERR_BAD_STATEID:
1124                         case -NFS4ERR_EXPIRED:
1125                         case -NFS4ERR_NO_GRACE:
1126                         case -NFS4ERR_STALE_CLIENTID:
1127                         case -NFS4ERR_BADSESSION:
1128                         case -NFS4ERR_BADSLOT:
1129                         case -NFS4ERR_BAD_HIGH_SLOT:
1130                         case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
1131                                 goto out;
1132                         default:
1133                                 printk(KERN_ERR "%s: unhandled error %d. Zeroing state\n",
1134                                                 __func__, status);
1135                         case -ENOMEM:
1136                         case -NFS4ERR_DENIED:
1137                         case -NFS4ERR_RECLAIM_BAD:
1138                         case -NFS4ERR_RECLAIM_CONFLICT:
1139                                 /* kill_proc(fl->fl_pid, SIGLOST, 1); */
1140                                 status = 0;
1141                 }
1142                 lock_flocks();
1143         }
1144         unlock_flocks();
1145 out:
1146         up_write(&nfsi->rwsem);
1147         return status;
1148 }
1149
1150 static int nfs4_reclaim_open_state(struct nfs4_state_owner *sp, const struct nfs4_state_recovery_ops *ops)
1151 {
1152         struct nfs4_state *state;
1153         struct nfs4_lock_state *lock;
1154         int status = 0;
1155
1156         /* Note: we rely on the sp->so_states list being ordered 
1157          * so that we always reclaim open(O_RDWR) and/or open(O_WRITE)
1158          * states first.
1159          * This is needed to ensure that the server won't give us any
1160          * read delegations that we have to return if, say, we are
1161          * recovering after a network partition or a reboot from a
1162          * server that doesn't support a grace period.
1163          */
1164 restart:
1165         spin_lock(&sp->so_lock);
1166         list_for_each_entry(state, &sp->so_states, open_states) {
1167                 if (!test_and_clear_bit(ops->state_flag_bit, &state->flags))
1168                         continue;
1169                 if (state->state == 0)
1170                         continue;
1171                 atomic_inc(&state->count);
1172                 spin_unlock(&sp->so_lock);
1173                 status = ops->recover_open(sp, state);
1174                 if (status >= 0) {
1175                         status = nfs4_reclaim_locks(state, ops);
1176                         if (status >= 0) {
1177                                 spin_lock(&state->state_lock);
1178                                 list_for_each_entry(lock, &state->lock_states, ls_locks) {
1179                                         if (!(lock->ls_flags & NFS_LOCK_INITIALIZED))
1180                                                 printk("%s: Lock reclaim failed!\n",
1181                                                         __func__);
1182                                 }
1183                                 spin_unlock(&state->state_lock);
1184                                 nfs4_put_open_state(state);
1185                                 goto restart;
1186                         }
1187                 }
1188                 switch (status) {
1189                         default:
1190                                 printk(KERN_ERR "%s: unhandled error %d. Zeroing state\n",
1191                                                 __func__, status);
1192                         case -ENOENT:
1193                         case -ENOMEM:
1194                         case -ESTALE:
1195                                 /*
1196                                  * Open state on this file cannot be recovered
1197                                  * All we can do is revert to using the zero stateid.
1198                                  */
1199                                 memset(state->stateid.data, 0,
1200                                         sizeof(state->stateid.data));
1201                                 /* Mark the file as being 'closed' */
1202                                 state->state = 0;
1203                                 break;
1204                         case -EKEYEXPIRED:
1205                                 /*
1206                                  * User RPCSEC_GSS context has expired.
1207                                  * We cannot recover this stateid now, so
1208                                  * skip it and allow recovery thread to
1209                                  * proceed.
1210                                  */
1211                                 break;
1212                         case -NFS4ERR_ADMIN_REVOKED:
1213                         case -NFS4ERR_STALE_STATEID:
1214                         case -NFS4ERR_BAD_STATEID:
1215                         case -NFS4ERR_RECLAIM_BAD:
1216                         case -NFS4ERR_RECLAIM_CONFLICT:
1217                                 nfs4_state_mark_reclaim_nograce(sp->so_server->nfs_client, state);
1218                                 break;
1219                         case -NFS4ERR_EXPIRED:
1220                         case -NFS4ERR_NO_GRACE:
1221                                 nfs4_state_mark_reclaim_nograce(sp->so_server->nfs_client, state);
1222                         case -NFS4ERR_STALE_CLIENTID:
1223                         case -NFS4ERR_BADSESSION:
1224                         case -NFS4ERR_BADSLOT:
1225                         case -NFS4ERR_BAD_HIGH_SLOT:
1226                         case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
1227                                 goto out_err;
1228                 }
1229                 nfs4_put_open_state(state);
1230                 goto restart;
1231         }
1232         spin_unlock(&sp->so_lock);
1233         return 0;
1234 out_err:
1235         nfs4_put_open_state(state);
1236         return status;
1237 }
1238
1239 static void nfs4_clear_open_state(struct nfs4_state *state)
1240 {
1241         struct nfs4_lock_state *lock;
1242
1243         clear_bit(NFS_DELEGATED_STATE, &state->flags);
1244         clear_bit(NFS_O_RDONLY_STATE, &state->flags);
1245         clear_bit(NFS_O_WRONLY_STATE, &state->flags);
1246         clear_bit(NFS_O_RDWR_STATE, &state->flags);
1247         spin_lock(&state->state_lock);
1248         list_for_each_entry(lock, &state->lock_states, ls_locks) {
1249                 lock->ls_seqid.flags = 0;
1250                 lock->ls_flags &= ~NFS_LOCK_INITIALIZED;
1251         }
1252         spin_unlock(&state->state_lock);
1253 }
1254
1255 static void nfs4_reset_seqids(struct nfs_server *server,
1256         int (*mark_reclaim)(struct nfs_client *clp, struct nfs4_state *state))
1257 {
1258         struct nfs_client *clp = server->nfs_client;
1259         struct nfs4_state_owner *sp;
1260         struct rb_node *pos;
1261         struct nfs4_state *state;
1262
1263         spin_lock(&clp->cl_lock);
1264         for (pos = rb_first(&server->state_owners);
1265              pos != NULL;
1266              pos = rb_next(pos)) {
1267                 sp = rb_entry(pos, struct nfs4_state_owner, so_server_node);
1268                 sp->so_seqid.flags = 0;
1269                 spin_lock(&sp->so_lock);
1270                 list_for_each_entry(state, &sp->so_states, open_states) {
1271                         if (mark_reclaim(clp, state))
1272                                 nfs4_clear_open_state(state);
1273                 }
1274                 spin_unlock(&sp->so_lock);
1275         }
1276         spin_unlock(&clp->cl_lock);
1277 }
1278
1279 static void nfs4_state_mark_reclaim_helper(struct nfs_client *clp,
1280         int (*mark_reclaim)(struct nfs_client *clp, struct nfs4_state *state))
1281 {
1282         struct nfs_server *server;
1283
1284         rcu_read_lock();
1285         list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
1286                 nfs4_reset_seqids(server, mark_reclaim);
1287         rcu_read_unlock();
1288 }
1289
1290 static void nfs4_state_start_reclaim_reboot(struct nfs_client *clp)
1291 {
1292         /* Mark all delegations for reclaim */
1293         nfs_delegation_mark_reclaim(clp);
1294         nfs4_state_mark_reclaim_helper(clp, nfs4_state_mark_reclaim_reboot);
1295 }
1296
1297 static void nfs4_reclaim_complete(struct nfs_client *clp,
1298                                  const struct nfs4_state_recovery_ops *ops)
1299 {
1300         /* Notify the server we're done reclaiming our state */
1301         if (ops->reclaim_complete)
1302                 (void)ops->reclaim_complete(clp);
1303 }
1304
1305 static void nfs4_clear_reclaim_server(struct nfs_server *server)
1306 {
1307         struct nfs_client *clp = server->nfs_client;
1308         struct nfs4_state_owner *sp;
1309         struct rb_node *pos;
1310         struct nfs4_state *state;
1311
1312         spin_lock(&clp->cl_lock);
1313         for (pos = rb_first(&server->state_owners);
1314              pos != NULL;
1315              pos = rb_next(pos)) {
1316                 sp = rb_entry(pos, struct nfs4_state_owner, so_server_node);
1317                 spin_lock(&sp->so_lock);
1318                 list_for_each_entry(state, &sp->so_states, open_states) {
1319                         if (!test_and_clear_bit(NFS_STATE_RECLAIM_REBOOT,
1320                                                 &state->flags))
1321                                 continue;
1322                         nfs4_state_mark_reclaim_nograce(clp, state);
1323                 }
1324                 spin_unlock(&sp->so_lock);
1325         }
1326         spin_unlock(&clp->cl_lock);
1327 }
1328
1329 static int nfs4_state_clear_reclaim_reboot(struct nfs_client *clp)
1330 {
1331         struct nfs_server *server;
1332
1333         if (!test_and_clear_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state))
1334                 return 0;
1335
1336         rcu_read_lock();
1337         list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
1338                 nfs4_clear_reclaim_server(server);
1339         rcu_read_unlock();
1340
1341         nfs_delegation_reap_unclaimed(clp);
1342         return 1;
1343 }
1344
1345 static void nfs4_state_end_reclaim_reboot(struct nfs_client *clp)
1346 {
1347         if (!nfs4_state_clear_reclaim_reboot(clp))
1348                 return;
1349         nfs4_reclaim_complete(clp, clp->cl_mvops->reboot_recovery_ops);
1350 }
1351
1352 static void nfs_delegation_clear_all(struct nfs_client *clp)
1353 {
1354         nfs_delegation_mark_reclaim(clp);
1355         nfs_delegation_reap_unclaimed(clp);
1356 }
1357
1358 static void nfs4_state_start_reclaim_nograce(struct nfs_client *clp)
1359 {
1360         nfs_delegation_clear_all(clp);
1361         nfs4_state_mark_reclaim_helper(clp, nfs4_state_mark_reclaim_nograce);
1362 }
1363
1364 static void nfs4_warn_keyexpired(const char *s)
1365 {
1366         printk_ratelimited(KERN_WARNING "Error: state manager"
1367                         " encountered RPCSEC_GSS session"
1368                         " expired against NFSv4 server %s.\n",
1369                         s);
1370 }
1371
1372 static int nfs4_recovery_handle_error(struct nfs_client *clp, int error)
1373 {
1374         switch (error) {
1375                 case 0:
1376                         break;
1377                 case -NFS4ERR_CB_PATH_DOWN:
1378                         nfs_handle_cb_pathdown(clp);
1379                         break;
1380                 case -NFS4ERR_NO_GRACE:
1381                         nfs4_state_end_reclaim_reboot(clp);
1382                         break;
1383                 case -NFS4ERR_STALE_CLIENTID:
1384                 case -NFS4ERR_LEASE_MOVED:
1385                         set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
1386                         nfs4_state_clear_reclaim_reboot(clp);
1387                         nfs4_state_start_reclaim_reboot(clp);
1388                         break;
1389                 case -NFS4ERR_EXPIRED:
1390                         set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
1391                         nfs4_state_start_reclaim_nograce(clp);
1392                         break;
1393                 case -NFS4ERR_BADSESSION:
1394                 case -NFS4ERR_BADSLOT:
1395                 case -NFS4ERR_BAD_HIGH_SLOT:
1396                 case -NFS4ERR_DEADSESSION:
1397                 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
1398                 case -NFS4ERR_SEQ_FALSE_RETRY:
1399                 case -NFS4ERR_SEQ_MISORDERED:
1400                         set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state);
1401                         /* Zero session reset errors */
1402                         break;
1403                 case -EKEYEXPIRED:
1404                         /* Nothing we can do */
1405                         nfs4_warn_keyexpired(clp->cl_hostname);
1406                         break;
1407                 default:
1408                         return error;
1409         }
1410         return 0;
1411 }
1412
1413 static int nfs4_do_reclaim(struct nfs_client *clp, const struct nfs4_state_recovery_ops *ops)
1414 {
1415         struct nfs4_state_owner *sp;
1416         struct nfs_server *server;
1417         struct rb_node *pos;
1418         int status = 0;
1419
1420 restart:
1421         rcu_read_lock();
1422         list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
1423                 nfs4_purge_state_owners(server);
1424                 spin_lock(&clp->cl_lock);
1425                 for (pos = rb_first(&server->state_owners);
1426                      pos != NULL;
1427                      pos = rb_next(pos)) {
1428                         sp = rb_entry(pos,
1429                                 struct nfs4_state_owner, so_server_node);
1430                         if (!test_and_clear_bit(ops->owner_flag_bit,
1431                                                         &sp->so_flags))
1432                                 continue;
1433                         atomic_inc(&sp->so_count);
1434                         spin_unlock(&clp->cl_lock);
1435                         rcu_read_unlock();
1436
1437                         status = nfs4_reclaim_open_state(sp, ops);
1438                         if (status < 0) {
1439                                 set_bit(ops->owner_flag_bit, &sp->so_flags);
1440                                 nfs4_put_state_owner(sp);
1441                                 return nfs4_recovery_handle_error(clp, status);
1442                         }
1443
1444                         nfs4_put_state_owner(sp);
1445                         goto restart;
1446                 }
1447                 spin_unlock(&clp->cl_lock);
1448         }
1449         rcu_read_unlock();
1450         return status;
1451 }
1452
1453 static int nfs4_check_lease(struct nfs_client *clp)
1454 {
1455         struct rpc_cred *cred;
1456         const struct nfs4_state_maintenance_ops *ops =
1457                 clp->cl_mvops->state_renewal_ops;
1458         int status;
1459
1460         /* Is the client already known to have an expired lease? */
1461         if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state))
1462                 return 0;
1463         spin_lock(&clp->cl_lock);
1464         cred = ops->get_state_renewal_cred_locked(clp);
1465         spin_unlock(&clp->cl_lock);
1466         if (cred == NULL) {
1467                 cred = nfs4_get_setclientid_cred(clp);
1468                 status = -ENOKEY;
1469                 if (cred == NULL)
1470                         goto out;
1471         }
1472         status = ops->renew_lease(clp, cred);
1473         put_rpccred(cred);
1474 out:
1475         return nfs4_recovery_handle_error(clp, status);
1476 }
1477
1478 static int nfs4_reclaim_lease(struct nfs_client *clp)
1479 {
1480         struct rpc_cred *cred;
1481         const struct nfs4_state_recovery_ops *ops =
1482                 clp->cl_mvops->reboot_recovery_ops;
1483         int status = -ENOENT;
1484
1485         cred = ops->get_clid_cred(clp);
1486         if (cred != NULL) {
1487                 status = ops->establish_clid(clp, cred);
1488                 put_rpccred(cred);
1489                 /* Handle case where the user hasn't set up machine creds */
1490                 if (status == -EACCES && cred == clp->cl_machine_cred) {
1491                         nfs4_clear_machine_cred(clp);
1492                         status = -EAGAIN;
1493                 }
1494                 if (status == -NFS4ERR_MINOR_VERS_MISMATCH)
1495                         status = -EPROTONOSUPPORT;
1496         }
1497         return status;
1498 }
1499
1500 #ifdef CONFIG_NFS_V4_1
1501 void nfs4_schedule_session_recovery(struct nfs4_session *session)
1502 {
1503         struct nfs_client *clp = session->clp;
1504
1505         set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state);
1506         nfs4_schedule_lease_recovery(clp);
1507 }
1508 EXPORT_SYMBOL_GPL(nfs4_schedule_session_recovery);
1509
1510 void nfs41_handle_recall_slot(struct nfs_client *clp)
1511 {
1512         set_bit(NFS4CLNT_RECALL_SLOT, &clp->cl_state);
1513         nfs4_schedule_state_manager(clp);
1514 }
1515
1516 static void nfs4_reset_all_state(struct nfs_client *clp)
1517 {
1518         if (test_and_set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) == 0) {
1519                 clp->cl_boot_time = CURRENT_TIME;
1520                 nfs4_state_start_reclaim_nograce(clp);
1521                 nfs4_schedule_state_manager(clp);
1522         }
1523 }
1524
1525 static void nfs41_handle_server_reboot(struct nfs_client *clp)
1526 {
1527         if (test_and_set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) == 0) {
1528                 nfs4_state_start_reclaim_reboot(clp);
1529                 nfs4_schedule_state_manager(clp);
1530         }
1531 }
1532
1533 static void nfs41_handle_state_revoked(struct nfs_client *clp)
1534 {
1535         /* Temporary */
1536         nfs4_reset_all_state(clp);
1537 }
1538
1539 static void nfs41_handle_recallable_state_revoked(struct nfs_client *clp)
1540 {
1541         /* This will need to handle layouts too */
1542         nfs_expire_all_delegations(clp);
1543 }
1544
1545 static void nfs41_handle_cb_path_down(struct nfs_client *clp)
1546 {
1547         nfs_expire_all_delegations(clp);
1548         if (test_and_set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state) == 0)
1549                 nfs4_schedule_state_manager(clp);
1550 }
1551
1552 void nfs41_handle_sequence_flag_errors(struct nfs_client *clp, u32 flags)
1553 {
1554         if (!flags)
1555                 return;
1556         if (flags & SEQ4_STATUS_RESTART_RECLAIM_NEEDED)
1557                 nfs41_handle_server_reboot(clp);
1558         if (flags & (SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED |
1559                             SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED |
1560                             SEQ4_STATUS_ADMIN_STATE_REVOKED |
1561                             SEQ4_STATUS_LEASE_MOVED))
1562                 nfs41_handle_state_revoked(clp);
1563         if (flags & SEQ4_STATUS_RECALLABLE_STATE_REVOKED)
1564                 nfs41_handle_recallable_state_revoked(clp);
1565         if (flags & (SEQ4_STATUS_CB_PATH_DOWN |
1566                             SEQ4_STATUS_BACKCHANNEL_FAULT |
1567                             SEQ4_STATUS_CB_PATH_DOWN_SESSION))
1568                 nfs41_handle_cb_path_down(clp);
1569 }
1570
1571 static int nfs4_reset_session(struct nfs_client *clp)
1572 {
1573         int status;
1574
1575         nfs4_begin_drain_session(clp);
1576         status = nfs4_proc_destroy_session(clp->cl_session);
1577         if (status && status != -NFS4ERR_BADSESSION &&
1578             status != -NFS4ERR_DEADSESSION) {
1579                 status = nfs4_recovery_handle_error(clp, status);
1580                 goto out;
1581         }
1582
1583         memset(clp->cl_session->sess_id.data, 0, NFS4_MAX_SESSIONID_LEN);
1584         status = nfs4_proc_create_session(clp);
1585         if (status) {
1586                 status = nfs4_recovery_handle_error(clp, status);
1587                 goto out;
1588         }
1589         clear_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state);
1590         /* create_session negotiated new slot table */
1591         clear_bit(NFS4CLNT_RECALL_SLOT, &clp->cl_state);
1592
1593          /* Let the state manager reestablish state */
1594         if (!test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state))
1595                 nfs41_setup_state_renewal(clp);
1596 out:
1597         return status;
1598 }
1599
1600 static int nfs4_recall_slot(struct nfs_client *clp)
1601 {
1602         struct nfs4_slot_table *fc_tbl = &clp->cl_session->fc_slot_table;
1603         struct nfs4_channel_attrs *fc_attrs = &clp->cl_session->fc_attrs;
1604         struct nfs4_slot *new, *old;
1605         int i;
1606
1607         nfs4_begin_drain_session(clp);
1608         new = kmalloc(fc_tbl->target_max_slots * sizeof(struct nfs4_slot),
1609                       GFP_NOFS);
1610         if (!new)
1611                 return -ENOMEM;
1612
1613         spin_lock(&fc_tbl->slot_tbl_lock);
1614         for (i = 0; i < fc_tbl->target_max_slots; i++)
1615                 new[i].seq_nr = fc_tbl->slots[i].seq_nr;
1616         old = fc_tbl->slots;
1617         fc_tbl->slots = new;
1618         fc_tbl->max_slots = fc_tbl->target_max_slots;
1619         fc_tbl->target_max_slots = 0;
1620         fc_attrs->max_reqs = fc_tbl->max_slots;
1621         spin_unlock(&fc_tbl->slot_tbl_lock);
1622
1623         kfree(old);
1624         nfs4_end_drain_session(clp);
1625         return 0;
1626 }
1627
1628 #else /* CONFIG_NFS_V4_1 */
1629 static int nfs4_reset_session(struct nfs_client *clp) { return 0; }
1630 static int nfs4_end_drain_session(struct nfs_client *clp) { return 0; }
1631 static int nfs4_recall_slot(struct nfs_client *clp) { return 0; }
1632 #endif /* CONFIG_NFS_V4_1 */
1633
1634 /* Set NFS4CLNT_LEASE_EXPIRED for all v4.0 errors and for recoverable errors
1635  * on EXCHANGE_ID for v4.1
1636  */
1637 static void nfs4_set_lease_expired(struct nfs_client *clp, int status)
1638 {
1639         switch (status) {
1640         case -NFS4ERR_CLID_INUSE:
1641         case -NFS4ERR_STALE_CLIENTID:
1642                 clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state);
1643                 break;
1644         case -NFS4ERR_DELAY:
1645         case -ETIMEDOUT:
1646         case -EAGAIN:
1647                 ssleep(1);
1648                 break;
1649
1650         case -EKEYEXPIRED:
1651                 nfs4_warn_keyexpired(clp->cl_hostname);
1652         case -NFS4ERR_NOT_SAME: /* FixMe: implement recovery
1653                                  * in nfs4_exchange_id */
1654         default:
1655                 return;
1656         }
1657         set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
1658 }
1659
1660 static void nfs4_state_manager(struct nfs_client *clp)
1661 {
1662         int status = 0;
1663
1664         /* Ensure exclusive access to NFSv4 state */
1665         do {
1666                 if (test_and_clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) {
1667                         /* We're going to have to re-establish a clientid */
1668                         status = nfs4_reclaim_lease(clp);
1669                         if (status) {
1670                                 nfs4_set_lease_expired(clp, status);
1671                                 if (test_bit(NFS4CLNT_LEASE_EXPIRED,
1672                                                         &clp->cl_state))
1673                                         continue;
1674                                 if (clp->cl_cons_state ==
1675                                                         NFS_CS_SESSION_INITING)
1676                                         nfs_mark_client_ready(clp, status);
1677                                 goto out_error;
1678                         }
1679                         clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state);
1680
1681                         if (test_and_clear_bit(NFS4CLNT_SERVER_SCOPE_MISMATCH,
1682                                                &clp->cl_state))
1683                                 nfs4_state_start_reclaim_nograce(clp);
1684                         else
1685                                 set_bit(NFS4CLNT_RECLAIM_REBOOT,
1686                                         &clp->cl_state);
1687
1688                         pnfs_destroy_all_layouts(clp);
1689                 }
1690
1691                 if (test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) {
1692                         status = nfs4_check_lease(clp);
1693                         if (status < 0)
1694                                 goto out_error;
1695                         if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state))
1696                                 continue;
1697                 }
1698
1699                 /* Initialize or reset the session */
1700                 if (test_and_clear_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state)
1701                    && nfs4_has_session(clp)) {
1702                         status = nfs4_reset_session(clp);
1703                         if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state))
1704                                 continue;
1705                         if (status < 0)
1706                                 goto out_error;
1707                 }
1708
1709                 /* First recover reboot state... */
1710                 if (test_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state)) {
1711                         status = nfs4_do_reclaim(clp,
1712                                 clp->cl_mvops->reboot_recovery_ops);
1713                         if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) ||
1714                             test_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state))
1715                                 continue;
1716                         nfs4_state_end_reclaim_reboot(clp);
1717                         if (test_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state))
1718                                 continue;
1719                         if (status < 0)
1720                                 goto out_error;
1721                 }
1722
1723                 /* Now recover expired state... */
1724                 if (test_and_clear_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state)) {
1725                         status = nfs4_do_reclaim(clp,
1726                                 clp->cl_mvops->nograce_recovery_ops);
1727                         if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) ||
1728                             test_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state) ||
1729                             test_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state))
1730                                 continue;
1731                         if (status < 0)
1732                                 goto out_error;
1733                 }
1734
1735                 nfs4_end_drain_session(clp);
1736                 if (test_and_clear_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state)) {
1737                         nfs_client_return_marked_delegations(clp);
1738                         continue;
1739                 }
1740                 /* Recall session slots */
1741                 if (test_and_clear_bit(NFS4CLNT_RECALL_SLOT, &clp->cl_state)
1742                    && nfs4_has_session(clp)) {
1743                         status = nfs4_recall_slot(clp);
1744                         if (status < 0)
1745                                 goto out_error;
1746                         continue;
1747                 }
1748
1749
1750                 nfs4_clear_state_manager_bit(clp);
1751                 /* Did we race with an attempt to give us more work? */
1752                 if (clp->cl_state == 0)
1753                         break;
1754                 if (test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) != 0)
1755                         break;
1756         } while (atomic_read(&clp->cl_count) > 1);
1757         return;
1758 out_error:
1759         printk(KERN_WARNING "Error: state manager failed on NFSv4 server %s"
1760                         " with error %d\n", clp->cl_hostname, -status);
1761         nfs4_end_drain_session(clp);
1762         nfs4_clear_state_manager_bit(clp);
1763 }
1764
1765 static int nfs4_run_state_manager(void *ptr)
1766 {
1767         struct nfs_client *clp = ptr;
1768
1769         allow_signal(SIGKILL);
1770         nfs4_state_manager(clp);
1771         nfs_put_client(clp);
1772         module_put_and_exit(0);
1773         return 0;
1774 }
1775
1776 /*
1777  * Local variables:
1778  *  c-basic-offset: 8
1779  * End:
1780  */