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