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