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