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