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