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/nfs_idmap.h> 46 #include <linux/kthread.h> 47 #include <linux/module.h> 48 #include <linux/random.h> 49 #include <linux/ratelimit.h> 50 #include <linux/workqueue.h> 51 #include <linux/bitops.h> 52 #include <linux/jiffies.h> 53 54 #include "nfs4_fs.h" 55 #include "callback.h" 56 #include "delegation.h" 57 #include "internal.h" 58 #include "pnfs.h" 59 60 #define OPENOWNER_POOL_SIZE 8 61 62 const nfs4_stateid zero_stateid; 63 64 static LIST_HEAD(nfs4_clientid_list); 65 66 int nfs4_init_clientid(struct nfs_client *clp, struct rpc_cred *cred) 67 { 68 struct nfs4_setclientid_res clid = { 69 .clientid = clp->cl_clientid, 70 .confirm = clp->cl_confirm, 71 }; 72 unsigned short port; 73 int status; 74 75 if (test_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state)) 76 goto do_confirm; 77 port = nfs_callback_tcpport; 78 if (clp->cl_addr.ss_family == AF_INET6) 79 port = nfs_callback_tcpport6; 80 81 status = nfs4_proc_setclientid(clp, NFS4_CALLBACK, port, cred, &clid); 82 if (status != 0) 83 goto out; 84 clp->cl_clientid = clid.clientid; 85 clp->cl_confirm = clid.confirm; 86 set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); 87 do_confirm: 88 status = nfs4_proc_setclientid_confirm(clp, &clid, cred); 89 if (status != 0) 90 goto out; 91 clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); 92 nfs4_schedule_state_renewal(clp); 93 out: 94 return status; 95 } 96 97 struct rpc_cred *nfs4_get_machine_cred_locked(struct nfs_client *clp) 98 { 99 struct rpc_cred *cred = NULL; 100 101 if (clp->cl_machine_cred != NULL) 102 cred = get_rpccred(clp->cl_machine_cred); 103 return cred; 104 } 105 106 static void nfs4_clear_machine_cred(struct nfs_client *clp) 107 { 108 struct rpc_cred *cred; 109 110 spin_lock(&clp->cl_lock); 111 cred = clp->cl_machine_cred; 112 clp->cl_machine_cred = NULL; 113 spin_unlock(&clp->cl_lock); 114 if (cred != NULL) 115 put_rpccred(cred); 116 } 117 118 static struct rpc_cred * 119 nfs4_get_renew_cred_server_locked(struct nfs_server *server) 120 { 121 struct rpc_cred *cred = NULL; 122 struct nfs4_state_owner *sp; 123 struct rb_node *pos; 124 125 for (pos = rb_first(&server->state_owners); 126 pos != NULL; 127 pos = rb_next(pos)) { 128 sp = rb_entry(pos, struct nfs4_state_owner, so_server_node); 129 if (list_empty(&sp->so_states)) 130 continue; 131 cred = get_rpccred(sp->so_cred); 132 break; 133 } 134 return cred; 135 } 136 137 /** 138 * nfs4_get_renew_cred_locked - Acquire credential for a renew operation 139 * @clp: client state handle 140 * 141 * Returns an rpc_cred with reference count bumped, or NULL. 142 * Caller must hold clp->cl_lock. 143 */ 144 struct rpc_cred *nfs4_get_renew_cred_locked(struct nfs_client *clp) 145 { 146 struct rpc_cred *cred = NULL; 147 struct nfs_server *server; 148 149 /* Use machine credentials if available */ 150 cred = nfs4_get_machine_cred_locked(clp); 151 if (cred != NULL) 152 goto out; 153 154 rcu_read_lock(); 155 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { 156 cred = nfs4_get_renew_cred_server_locked(server); 157 if (cred != NULL) 158 break; 159 } 160 rcu_read_unlock(); 161 162 out: 163 return cred; 164 } 165 166 #if defined(CONFIG_NFS_V4_1) 167 168 static int nfs41_setup_state_renewal(struct nfs_client *clp) 169 { 170 int status; 171 struct nfs_fsinfo fsinfo; 172 173 if (!test_bit(NFS_CS_CHECK_LEASE_TIME, &clp->cl_res_state)) { 174 nfs4_schedule_state_renewal(clp); 175 return 0; 176 } 177 178 status = nfs4_proc_get_lease_time(clp, &fsinfo); 179 if (status == 0) { 180 /* Update lease time and schedule renewal */ 181 spin_lock(&clp->cl_lock); 182 clp->cl_lease_time = fsinfo.lease_time * HZ; 183 clp->cl_last_renewal = jiffies; 184 spin_unlock(&clp->cl_lock); 185 186 nfs4_schedule_state_renewal(clp); 187 } 188 189 return status; 190 } 191 192 /* 193 * Back channel returns NFS4ERR_DELAY for new requests when 194 * NFS4_SESSION_DRAINING is set so there is no work to be done when draining 195 * is ended. 196 */ 197 static void nfs4_end_drain_session(struct nfs_client *clp) 198 { 199 struct nfs4_session *ses = clp->cl_session; 200 struct nfs4_slot_table *tbl; 201 int max_slots; 202 203 if (ses == NULL) 204 return; 205 tbl = &ses->fc_slot_table; 206 if (test_and_clear_bit(NFS4_SESSION_DRAINING, &ses->session_state)) { 207 spin_lock(&tbl->slot_tbl_lock); 208 max_slots = tbl->max_slots; 209 while (max_slots--) { 210 if (rpc_wake_up_first(&tbl->slot_tbl_waitq, 211 nfs4_set_task_privileged, 212 NULL) == NULL) 213 break; 214 } 215 spin_unlock(&tbl->slot_tbl_lock); 216 } 217 } 218 219 static int nfs4_wait_on_slot_tbl(struct nfs4_slot_table *tbl) 220 { 221 spin_lock(&tbl->slot_tbl_lock); 222 if (tbl->highest_used_slotid != NFS4_NO_SLOT) { 223 INIT_COMPLETION(tbl->complete); 224 spin_unlock(&tbl->slot_tbl_lock); 225 return wait_for_completion_interruptible(&tbl->complete); 226 } 227 spin_unlock(&tbl->slot_tbl_lock); 228 return 0; 229 } 230 231 static int nfs4_begin_drain_session(struct nfs_client *clp) 232 { 233 struct nfs4_session *ses = clp->cl_session; 234 int ret = 0; 235 236 set_bit(NFS4_SESSION_DRAINING, &ses->session_state); 237 /* back channel */ 238 ret = nfs4_wait_on_slot_tbl(&ses->bc_slot_table); 239 if (ret) 240 return ret; 241 /* fore channel */ 242 return nfs4_wait_on_slot_tbl(&ses->fc_slot_table); 243 } 244 245 int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred) 246 { 247 int status; 248 249 if (test_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state)) 250 goto do_confirm; 251 nfs4_begin_drain_session(clp); 252 status = nfs4_proc_exchange_id(clp, cred); 253 if (status != 0) 254 goto out; 255 set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); 256 do_confirm: 257 status = nfs4_proc_create_session(clp); 258 if (status != 0) 259 goto out; 260 clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); 261 nfs41_setup_state_renewal(clp); 262 nfs_mark_client_ready(clp, NFS_CS_READY); 263 out: 264 return status; 265 } 266 267 struct rpc_cred *nfs4_get_exchange_id_cred(struct nfs_client *clp) 268 { 269 struct rpc_cred *cred; 270 271 spin_lock(&clp->cl_lock); 272 cred = nfs4_get_machine_cred_locked(clp); 273 spin_unlock(&clp->cl_lock); 274 return cred; 275 } 276 277 #endif /* CONFIG_NFS_V4_1 */ 278 279 static struct rpc_cred * 280 nfs4_get_setclientid_cred_server(struct nfs_server *server) 281 { 282 struct nfs_client *clp = server->nfs_client; 283 struct rpc_cred *cred = NULL; 284 struct nfs4_state_owner *sp; 285 struct rb_node *pos; 286 287 spin_lock(&clp->cl_lock); 288 pos = rb_first(&server->state_owners); 289 if (pos != NULL) { 290 sp = rb_entry(pos, struct nfs4_state_owner, so_server_node); 291 cred = get_rpccred(sp->so_cred); 292 } 293 spin_unlock(&clp->cl_lock); 294 return cred; 295 } 296 297 /** 298 * nfs4_get_setclientid_cred - Acquire credential for a setclientid operation 299 * @clp: client state handle 300 * 301 * Returns an rpc_cred with reference count bumped, or NULL. 302 */ 303 struct rpc_cred *nfs4_get_setclientid_cred(struct nfs_client *clp) 304 { 305 struct nfs_server *server; 306 struct rpc_cred *cred; 307 308 spin_lock(&clp->cl_lock); 309 cred = nfs4_get_machine_cred_locked(clp); 310 spin_unlock(&clp->cl_lock); 311 if (cred != NULL) 312 goto out; 313 314 rcu_read_lock(); 315 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { 316 cred = nfs4_get_setclientid_cred_server(server); 317 if (cred != NULL) 318 break; 319 } 320 rcu_read_unlock(); 321 322 out: 323 return cred; 324 } 325 326 static struct nfs4_state_owner * 327 nfs4_find_state_owner_locked(struct nfs_server *server, struct rpc_cred *cred) 328 { 329 struct rb_node **p = &server->state_owners.rb_node, 330 *parent = NULL; 331 struct nfs4_state_owner *sp; 332 333 while (*p != NULL) { 334 parent = *p; 335 sp = rb_entry(parent, struct nfs4_state_owner, so_server_node); 336 337 if (cred < sp->so_cred) 338 p = &parent->rb_left; 339 else if (cred > sp->so_cred) 340 p = &parent->rb_right; 341 else { 342 if (!list_empty(&sp->so_lru)) 343 list_del_init(&sp->so_lru); 344 atomic_inc(&sp->so_count); 345 return sp; 346 } 347 } 348 return NULL; 349 } 350 351 static struct nfs4_state_owner * 352 nfs4_insert_state_owner_locked(struct nfs4_state_owner *new) 353 { 354 struct nfs_server *server = new->so_server; 355 struct rb_node **p = &server->state_owners.rb_node, 356 *parent = NULL; 357 struct nfs4_state_owner *sp; 358 int err; 359 360 while (*p != NULL) { 361 parent = *p; 362 sp = rb_entry(parent, struct nfs4_state_owner, so_server_node); 363 364 if (new->so_cred < sp->so_cred) 365 p = &parent->rb_left; 366 else if (new->so_cred > sp->so_cred) 367 p = &parent->rb_right; 368 else { 369 if (!list_empty(&sp->so_lru)) 370 list_del_init(&sp->so_lru); 371 atomic_inc(&sp->so_count); 372 return sp; 373 } 374 } 375 err = ida_get_new(&server->openowner_id, &new->so_seqid.owner_id); 376 if (err) 377 return ERR_PTR(err); 378 rb_link_node(&new->so_server_node, parent, p); 379 rb_insert_color(&new->so_server_node, &server->state_owners); 380 return new; 381 } 382 383 static void 384 nfs4_remove_state_owner_locked(struct nfs4_state_owner *sp) 385 { 386 struct nfs_server *server = sp->so_server; 387 388 if (!RB_EMPTY_NODE(&sp->so_server_node)) 389 rb_erase(&sp->so_server_node, &server->state_owners); 390 ida_remove(&server->openowner_id, sp->so_seqid.owner_id); 391 } 392 393 static void 394 nfs4_init_seqid_counter(struct nfs_seqid_counter *sc) 395 { 396 sc->flags = 0; 397 sc->counter = 0; 398 spin_lock_init(&sc->lock); 399 INIT_LIST_HEAD(&sc->list); 400 rpc_init_wait_queue(&sc->wait, "Seqid_waitqueue"); 401 } 402 403 static void 404 nfs4_destroy_seqid_counter(struct nfs_seqid_counter *sc) 405 { 406 rpc_destroy_wait_queue(&sc->wait); 407 } 408 409 /* 410 * nfs4_alloc_state_owner(): this is called on the OPEN or CREATE path to 411 * create a new state_owner. 412 * 413 */ 414 static struct nfs4_state_owner * 415 nfs4_alloc_state_owner(struct nfs_server *server, 416 struct rpc_cred *cred, 417 gfp_t gfp_flags) 418 { 419 struct nfs4_state_owner *sp; 420 421 sp = kzalloc(sizeof(*sp), gfp_flags); 422 if (!sp) 423 return NULL; 424 sp->so_server = server; 425 sp->so_cred = get_rpccred(cred); 426 spin_lock_init(&sp->so_lock); 427 INIT_LIST_HEAD(&sp->so_states); 428 nfs4_init_seqid_counter(&sp->so_seqid); 429 atomic_set(&sp->so_count, 1); 430 INIT_LIST_HEAD(&sp->so_lru); 431 return sp; 432 } 433 434 static void 435 nfs4_drop_state_owner(struct nfs4_state_owner *sp) 436 { 437 if (!RB_EMPTY_NODE(&sp->so_server_node)) { 438 struct nfs_server *server = sp->so_server; 439 struct nfs_client *clp = server->nfs_client; 440 441 spin_lock(&clp->cl_lock); 442 rb_erase(&sp->so_server_node, &server->state_owners); 443 RB_CLEAR_NODE(&sp->so_server_node); 444 spin_unlock(&clp->cl_lock); 445 } 446 } 447 448 static void nfs4_free_state_owner(struct nfs4_state_owner *sp) 449 { 450 nfs4_destroy_seqid_counter(&sp->so_seqid); 451 put_rpccred(sp->so_cred); 452 kfree(sp); 453 } 454 455 static void nfs4_gc_state_owners(struct nfs_server *server) 456 { 457 struct nfs_client *clp = server->nfs_client; 458 struct nfs4_state_owner *sp, *tmp; 459 unsigned long time_min, time_max; 460 LIST_HEAD(doomed); 461 462 spin_lock(&clp->cl_lock); 463 time_max = jiffies; 464 time_min = (long)time_max - (long)clp->cl_lease_time; 465 list_for_each_entry_safe(sp, tmp, &server->state_owners_lru, so_lru) { 466 /* NB: LRU is sorted so that oldest is at the head */ 467 if (time_in_range(sp->so_expires, time_min, time_max)) 468 break; 469 list_move(&sp->so_lru, &doomed); 470 nfs4_remove_state_owner_locked(sp); 471 } 472 spin_unlock(&clp->cl_lock); 473 474 list_for_each_entry_safe(sp, tmp, &doomed, so_lru) { 475 list_del(&sp->so_lru); 476 nfs4_free_state_owner(sp); 477 } 478 } 479 480 /** 481 * nfs4_get_state_owner - Look up a state owner given a credential 482 * @server: nfs_server to search 483 * @cred: RPC credential to match 484 * 485 * Returns a pointer to an instantiated nfs4_state_owner struct, or NULL. 486 */ 487 struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *server, 488 struct rpc_cred *cred, 489 gfp_t gfp_flags) 490 { 491 struct nfs_client *clp = server->nfs_client; 492 struct nfs4_state_owner *sp, *new; 493 494 spin_lock(&clp->cl_lock); 495 sp = nfs4_find_state_owner_locked(server, cred); 496 spin_unlock(&clp->cl_lock); 497 if (sp != NULL) 498 goto out; 499 new = nfs4_alloc_state_owner(server, cred, gfp_flags); 500 if (new == NULL) 501 goto out; 502 do { 503 if (ida_pre_get(&server->openowner_id, gfp_flags) == 0) 504 break; 505 spin_lock(&clp->cl_lock); 506 sp = nfs4_insert_state_owner_locked(new); 507 spin_unlock(&clp->cl_lock); 508 } while (sp == ERR_PTR(-EAGAIN)); 509 if (sp != new) 510 nfs4_free_state_owner(new); 511 out: 512 nfs4_gc_state_owners(server); 513 return sp; 514 } 515 516 /** 517 * nfs4_put_state_owner - Release a nfs4_state_owner 518 * @sp: state owner data to release 519 */ 520 void nfs4_put_state_owner(struct nfs4_state_owner *sp) 521 { 522 struct nfs_server *server = sp->so_server; 523 struct nfs_client *clp = server->nfs_client; 524 525 if (!atomic_dec_and_lock(&sp->so_count, &clp->cl_lock)) 526 return; 527 528 if (!RB_EMPTY_NODE(&sp->so_server_node)) { 529 sp->so_expires = jiffies; 530 list_add_tail(&sp->so_lru, &server->state_owners_lru); 531 spin_unlock(&clp->cl_lock); 532 } else { 533 nfs4_remove_state_owner_locked(sp); 534 spin_unlock(&clp->cl_lock); 535 nfs4_free_state_owner(sp); 536 } 537 } 538 539 /** 540 * nfs4_purge_state_owners - Release all cached state owners 541 * @server: nfs_server with cached state owners to release 542 * 543 * Called at umount time. Remaining state owners will be on 544 * the LRU with ref count of zero. 545 */ 546 void nfs4_purge_state_owners(struct nfs_server *server) 547 { 548 struct nfs_client *clp = server->nfs_client; 549 struct nfs4_state_owner *sp, *tmp; 550 LIST_HEAD(doomed); 551 552 spin_lock(&clp->cl_lock); 553 list_for_each_entry_safe(sp, tmp, &server->state_owners_lru, so_lru) { 554 list_move(&sp->so_lru, &doomed); 555 nfs4_remove_state_owner_locked(sp); 556 } 557 spin_unlock(&clp->cl_lock); 558 559 list_for_each_entry_safe(sp, tmp, &doomed, so_lru) { 560 list_del(&sp->so_lru); 561 nfs4_free_state_owner(sp); 562 } 563 } 564 565 static struct nfs4_state * 566 nfs4_alloc_open_state(void) 567 { 568 struct nfs4_state *state; 569 570 state = kzalloc(sizeof(*state), GFP_NOFS); 571 if (!state) 572 return NULL; 573 atomic_set(&state->count, 1); 574 INIT_LIST_HEAD(&state->lock_states); 575 spin_lock_init(&state->state_lock); 576 seqlock_init(&state->seqlock); 577 return state; 578 } 579 580 void 581 nfs4_state_set_mode_locked(struct nfs4_state *state, fmode_t fmode) 582 { 583 if (state->state == fmode) 584 return; 585 /* NB! List reordering - see the reclaim code for why. */ 586 if ((fmode & FMODE_WRITE) != (state->state & FMODE_WRITE)) { 587 if (fmode & FMODE_WRITE) 588 list_move(&state->open_states, &state->owner->so_states); 589 else 590 list_move_tail(&state->open_states, &state->owner->so_states); 591 } 592 state->state = fmode; 593 } 594 595 static struct nfs4_state * 596 __nfs4_find_state_byowner(struct inode *inode, struct nfs4_state_owner *owner) 597 { 598 struct nfs_inode *nfsi = NFS_I(inode); 599 struct nfs4_state *state; 600 601 list_for_each_entry(state, &nfsi->open_states, inode_states) { 602 if (state->owner != owner) 603 continue; 604 if (atomic_inc_not_zero(&state->count)) 605 return state; 606 } 607 return NULL; 608 } 609 610 static void 611 nfs4_free_open_state(struct nfs4_state *state) 612 { 613 kfree(state); 614 } 615 616 struct nfs4_state * 617 nfs4_get_open_state(struct inode *inode, struct nfs4_state_owner *owner) 618 { 619 struct nfs4_state *state, *new; 620 struct nfs_inode *nfsi = NFS_I(inode); 621 622 spin_lock(&inode->i_lock); 623 state = __nfs4_find_state_byowner(inode, owner); 624 spin_unlock(&inode->i_lock); 625 if (state) 626 goto out; 627 new = nfs4_alloc_open_state(); 628 spin_lock(&owner->so_lock); 629 spin_lock(&inode->i_lock); 630 state = __nfs4_find_state_byowner(inode, owner); 631 if (state == NULL && new != NULL) { 632 state = new; 633 state->owner = owner; 634 atomic_inc(&owner->so_count); 635 list_add(&state->inode_states, &nfsi->open_states); 636 ihold(inode); 637 state->inode = inode; 638 spin_unlock(&inode->i_lock); 639 /* Note: The reclaim code dictates that we add stateless 640 * and read-only stateids to the end of the list */ 641 list_add_tail(&state->open_states, &owner->so_states); 642 spin_unlock(&owner->so_lock); 643 } else { 644 spin_unlock(&inode->i_lock); 645 spin_unlock(&owner->so_lock); 646 if (new) 647 nfs4_free_open_state(new); 648 } 649 out: 650 return state; 651 } 652 653 void nfs4_put_open_state(struct nfs4_state *state) 654 { 655 struct inode *inode = state->inode; 656 struct nfs4_state_owner *owner = state->owner; 657 658 if (!atomic_dec_and_lock(&state->count, &owner->so_lock)) 659 return; 660 spin_lock(&inode->i_lock); 661 list_del(&state->inode_states); 662 list_del(&state->open_states); 663 spin_unlock(&inode->i_lock); 664 spin_unlock(&owner->so_lock); 665 iput(inode); 666 nfs4_free_open_state(state); 667 nfs4_put_state_owner(owner); 668 } 669 670 /* 671 * Close the current file. 672 */ 673 static void __nfs4_close(struct nfs4_state *state, 674 fmode_t fmode, gfp_t gfp_mask, int wait) 675 { 676 struct nfs4_state_owner *owner = state->owner; 677 int call_close = 0; 678 fmode_t newstate; 679 680 atomic_inc(&owner->so_count); 681 /* Protect against nfs4_find_state() */ 682 spin_lock(&owner->so_lock); 683 switch (fmode & (FMODE_READ | FMODE_WRITE)) { 684 case FMODE_READ: 685 state->n_rdonly--; 686 break; 687 case FMODE_WRITE: 688 state->n_wronly--; 689 break; 690 case FMODE_READ|FMODE_WRITE: 691 state->n_rdwr--; 692 } 693 newstate = FMODE_READ|FMODE_WRITE; 694 if (state->n_rdwr == 0) { 695 if (state->n_rdonly == 0) { 696 newstate &= ~FMODE_READ; 697 call_close |= test_bit(NFS_O_RDONLY_STATE, &state->flags); 698 call_close |= test_bit(NFS_O_RDWR_STATE, &state->flags); 699 } 700 if (state->n_wronly == 0) { 701 newstate &= ~FMODE_WRITE; 702 call_close |= test_bit(NFS_O_WRONLY_STATE, &state->flags); 703 call_close |= test_bit(NFS_O_RDWR_STATE, &state->flags); 704 } 705 if (newstate == 0) 706 clear_bit(NFS_DELEGATED_STATE, &state->flags); 707 } 708 nfs4_state_set_mode_locked(state, newstate); 709 spin_unlock(&owner->so_lock); 710 711 if (!call_close) { 712 nfs4_put_open_state(state); 713 nfs4_put_state_owner(owner); 714 } else { 715 bool roc = pnfs_roc(state->inode); 716 717 nfs4_do_close(state, gfp_mask, wait, roc); 718 } 719 } 720 721 void nfs4_close_state(struct nfs4_state *state, fmode_t fmode) 722 { 723 __nfs4_close(state, fmode, GFP_NOFS, 0); 724 } 725 726 void nfs4_close_sync(struct nfs4_state *state, fmode_t fmode) 727 { 728 __nfs4_close(state, fmode, GFP_KERNEL, 1); 729 } 730 731 /* 732 * Search the state->lock_states for an existing lock_owner 733 * that is compatible with current->files 734 */ 735 static struct nfs4_lock_state * 736 __nfs4_find_lock_state(struct nfs4_state *state, fl_owner_t fl_owner, pid_t fl_pid, unsigned int type) 737 { 738 struct nfs4_lock_state *pos; 739 list_for_each_entry(pos, &state->lock_states, ls_locks) { 740 if (type != NFS4_ANY_LOCK_TYPE && pos->ls_owner.lo_type != type) 741 continue; 742 switch (pos->ls_owner.lo_type) { 743 case NFS4_POSIX_LOCK_TYPE: 744 if (pos->ls_owner.lo_u.posix_owner != fl_owner) 745 continue; 746 break; 747 case NFS4_FLOCK_LOCK_TYPE: 748 if (pos->ls_owner.lo_u.flock_owner != fl_pid) 749 continue; 750 } 751 atomic_inc(&pos->ls_count); 752 return pos; 753 } 754 return NULL; 755 } 756 757 /* 758 * Return a compatible lock_state. If no initialized lock_state structure 759 * exists, return an uninitialized one. 760 * 761 */ 762 static struct nfs4_lock_state *nfs4_alloc_lock_state(struct nfs4_state *state, fl_owner_t fl_owner, pid_t fl_pid, unsigned int type) 763 { 764 struct nfs4_lock_state *lsp; 765 struct nfs_server *server = state->owner->so_server; 766 767 lsp = kzalloc(sizeof(*lsp), GFP_NOFS); 768 if (lsp == NULL) 769 return NULL; 770 nfs4_init_seqid_counter(&lsp->ls_seqid); 771 atomic_set(&lsp->ls_count, 1); 772 lsp->ls_state = state; 773 lsp->ls_owner.lo_type = type; 774 switch (lsp->ls_owner.lo_type) { 775 case NFS4_FLOCK_LOCK_TYPE: 776 lsp->ls_owner.lo_u.flock_owner = fl_pid; 777 break; 778 case NFS4_POSIX_LOCK_TYPE: 779 lsp->ls_owner.lo_u.posix_owner = fl_owner; 780 break; 781 default: 782 goto out_free; 783 } 784 lsp->ls_seqid.owner_id = ida_simple_get(&server->lockowner_id, 0, 0, GFP_NOFS); 785 if (lsp->ls_seqid.owner_id < 0) 786 goto out_free; 787 INIT_LIST_HEAD(&lsp->ls_locks); 788 return lsp; 789 out_free: 790 kfree(lsp); 791 return NULL; 792 } 793 794 void nfs4_free_lock_state(struct nfs_server *server, struct nfs4_lock_state *lsp) 795 { 796 ida_simple_remove(&server->lockowner_id, lsp->ls_seqid.owner_id); 797 nfs4_destroy_seqid_counter(&lsp->ls_seqid); 798 kfree(lsp); 799 } 800 801 /* 802 * Return a compatible lock_state. If no initialized lock_state structure 803 * exists, return an uninitialized one. 804 * 805 */ 806 static struct nfs4_lock_state *nfs4_get_lock_state(struct nfs4_state *state, fl_owner_t owner, pid_t pid, unsigned int type) 807 { 808 struct nfs4_lock_state *lsp, *new = NULL; 809 810 for(;;) { 811 spin_lock(&state->state_lock); 812 lsp = __nfs4_find_lock_state(state, owner, pid, type); 813 if (lsp != NULL) 814 break; 815 if (new != NULL) { 816 list_add(&new->ls_locks, &state->lock_states); 817 set_bit(LK_STATE_IN_USE, &state->flags); 818 lsp = new; 819 new = NULL; 820 break; 821 } 822 spin_unlock(&state->state_lock); 823 new = nfs4_alloc_lock_state(state, owner, pid, type); 824 if (new == NULL) 825 return NULL; 826 } 827 spin_unlock(&state->state_lock); 828 if (new != NULL) 829 nfs4_free_lock_state(state->owner->so_server, new); 830 return lsp; 831 } 832 833 /* 834 * Release reference to lock_state, and free it if we see that 835 * it is no longer in use 836 */ 837 void nfs4_put_lock_state(struct nfs4_lock_state *lsp) 838 { 839 struct nfs4_state *state; 840 841 if (lsp == NULL) 842 return; 843 state = lsp->ls_state; 844 if (!atomic_dec_and_lock(&lsp->ls_count, &state->state_lock)) 845 return; 846 list_del(&lsp->ls_locks); 847 if (list_empty(&state->lock_states)) 848 clear_bit(LK_STATE_IN_USE, &state->flags); 849 spin_unlock(&state->state_lock); 850 if (lsp->ls_flags & NFS_LOCK_INITIALIZED) { 851 if (nfs4_release_lockowner(lsp) == 0) 852 return; 853 } 854 nfs4_free_lock_state(lsp->ls_state->owner->so_server, lsp); 855 } 856 857 static void nfs4_fl_copy_lock(struct file_lock *dst, struct file_lock *src) 858 { 859 struct nfs4_lock_state *lsp = src->fl_u.nfs4_fl.owner; 860 861 dst->fl_u.nfs4_fl.owner = lsp; 862 atomic_inc(&lsp->ls_count); 863 } 864 865 static void nfs4_fl_release_lock(struct file_lock *fl) 866 { 867 nfs4_put_lock_state(fl->fl_u.nfs4_fl.owner); 868 } 869 870 static const struct file_lock_operations nfs4_fl_lock_ops = { 871 .fl_copy_lock = nfs4_fl_copy_lock, 872 .fl_release_private = nfs4_fl_release_lock, 873 }; 874 875 int nfs4_set_lock_state(struct nfs4_state *state, struct file_lock *fl) 876 { 877 struct nfs4_lock_state *lsp; 878 879 if (fl->fl_ops != NULL) 880 return 0; 881 if (fl->fl_flags & FL_POSIX) 882 lsp = nfs4_get_lock_state(state, fl->fl_owner, 0, NFS4_POSIX_LOCK_TYPE); 883 else if (fl->fl_flags & FL_FLOCK) 884 lsp = nfs4_get_lock_state(state, NULL, fl->fl_pid, 885 NFS4_FLOCK_LOCK_TYPE); 886 else 887 return -EINVAL; 888 if (lsp == NULL) 889 return -ENOMEM; 890 fl->fl_u.nfs4_fl.owner = lsp; 891 fl->fl_ops = &nfs4_fl_lock_ops; 892 return 0; 893 } 894 895 static bool nfs4_copy_lock_stateid(nfs4_stateid *dst, struct nfs4_state *state, 896 fl_owner_t fl_owner, pid_t fl_pid) 897 { 898 struct nfs4_lock_state *lsp; 899 bool ret = false; 900 901 if (test_bit(LK_STATE_IN_USE, &state->flags) == 0) 902 goto out; 903 904 spin_lock(&state->state_lock); 905 lsp = __nfs4_find_lock_state(state, fl_owner, fl_pid, NFS4_ANY_LOCK_TYPE); 906 if (lsp != NULL && (lsp->ls_flags & NFS_LOCK_INITIALIZED) != 0) { 907 nfs4_stateid_copy(dst, &lsp->ls_stateid); 908 ret = true; 909 } 910 spin_unlock(&state->state_lock); 911 nfs4_put_lock_state(lsp); 912 out: 913 return ret; 914 } 915 916 static void nfs4_copy_open_stateid(nfs4_stateid *dst, struct nfs4_state *state) 917 { 918 int seq; 919 920 do { 921 seq = read_seqbegin(&state->seqlock); 922 nfs4_stateid_copy(dst, &state->stateid); 923 } while (read_seqretry(&state->seqlock, seq)); 924 } 925 926 /* 927 * Byte-range lock aware utility to initialize the stateid of read/write 928 * requests. 929 */ 930 void nfs4_select_rw_stateid(nfs4_stateid *dst, struct nfs4_state *state, 931 fmode_t fmode, fl_owner_t fl_owner, pid_t fl_pid) 932 { 933 if (nfs4_copy_delegation_stateid(dst, state->inode, fmode)) 934 return; 935 if (nfs4_copy_lock_stateid(dst, state, fl_owner, fl_pid)) 936 return; 937 nfs4_copy_open_stateid(dst, state); 938 } 939 940 struct nfs_seqid *nfs_alloc_seqid(struct nfs_seqid_counter *counter, gfp_t gfp_mask) 941 { 942 struct nfs_seqid *new; 943 944 new = kmalloc(sizeof(*new), gfp_mask); 945 if (new != NULL) { 946 new->sequence = counter; 947 INIT_LIST_HEAD(&new->list); 948 new->task = NULL; 949 } 950 return new; 951 } 952 953 void nfs_release_seqid(struct nfs_seqid *seqid) 954 { 955 struct nfs_seqid_counter *sequence; 956 957 if (list_empty(&seqid->list)) 958 return; 959 sequence = seqid->sequence; 960 spin_lock(&sequence->lock); 961 list_del_init(&seqid->list); 962 if (!list_empty(&sequence->list)) { 963 struct nfs_seqid *next; 964 965 next = list_first_entry(&sequence->list, 966 struct nfs_seqid, list); 967 rpc_wake_up_queued_task(&sequence->wait, next->task); 968 } 969 spin_unlock(&sequence->lock); 970 } 971 972 void nfs_free_seqid(struct nfs_seqid *seqid) 973 { 974 nfs_release_seqid(seqid); 975 kfree(seqid); 976 } 977 978 /* 979 * Increment the seqid if the OPEN/OPEN_DOWNGRADE/CLOSE succeeded, or 980 * failed with a seqid incrementing error - 981 * see comments nfs_fs.h:seqid_mutating_error() 982 */ 983 static void nfs_increment_seqid(int status, struct nfs_seqid *seqid) 984 { 985 BUG_ON(list_first_entry(&seqid->sequence->list, struct nfs_seqid, list) != seqid); 986 switch (status) { 987 case 0: 988 break; 989 case -NFS4ERR_BAD_SEQID: 990 if (seqid->sequence->flags & NFS_SEQID_CONFIRMED) 991 return; 992 pr_warn_ratelimited("NFS: v4 server returned a bad" 993 " sequence-id error on an" 994 " unconfirmed sequence %p!\n", 995 seqid->sequence); 996 case -NFS4ERR_STALE_CLIENTID: 997 case -NFS4ERR_STALE_STATEID: 998 case -NFS4ERR_BAD_STATEID: 999 case -NFS4ERR_BADXDR: 1000 case -NFS4ERR_RESOURCE: 1001 case -NFS4ERR_NOFILEHANDLE: 1002 /* Non-seqid mutating errors */ 1003 return; 1004 }; 1005 /* 1006 * Note: no locking needed as we are guaranteed to be first 1007 * on the sequence list 1008 */ 1009 seqid->sequence->counter++; 1010 } 1011 1012 void nfs_increment_open_seqid(int status, struct nfs_seqid *seqid) 1013 { 1014 struct nfs4_state_owner *sp = container_of(seqid->sequence, 1015 struct nfs4_state_owner, so_seqid); 1016 struct nfs_server *server = sp->so_server; 1017 1018 if (status == -NFS4ERR_BAD_SEQID) 1019 nfs4_drop_state_owner(sp); 1020 if (!nfs4_has_session(server->nfs_client)) 1021 nfs_increment_seqid(status, seqid); 1022 } 1023 1024 /* 1025 * Increment the seqid if the LOCK/LOCKU succeeded, or 1026 * failed with a seqid incrementing error - 1027 * see comments nfs_fs.h:seqid_mutating_error() 1028 */ 1029 void nfs_increment_lock_seqid(int status, struct nfs_seqid *seqid) 1030 { 1031 nfs_increment_seqid(status, seqid); 1032 } 1033 1034 int nfs_wait_on_sequence(struct nfs_seqid *seqid, struct rpc_task *task) 1035 { 1036 struct nfs_seqid_counter *sequence = seqid->sequence; 1037 int status = 0; 1038 1039 spin_lock(&sequence->lock); 1040 seqid->task = task; 1041 if (list_empty(&seqid->list)) 1042 list_add_tail(&seqid->list, &sequence->list); 1043 if (list_first_entry(&sequence->list, struct nfs_seqid, list) == seqid) 1044 goto unlock; 1045 rpc_sleep_on(&sequence->wait, task, NULL); 1046 status = -EAGAIN; 1047 unlock: 1048 spin_unlock(&sequence->lock); 1049 return status; 1050 } 1051 1052 static int nfs4_run_state_manager(void *); 1053 1054 static void nfs4_clear_state_manager_bit(struct nfs_client *clp) 1055 { 1056 smp_mb__before_clear_bit(); 1057 clear_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state); 1058 smp_mb__after_clear_bit(); 1059 wake_up_bit(&clp->cl_state, NFS4CLNT_MANAGER_RUNNING); 1060 rpc_wake_up(&clp->cl_rpcwaitq); 1061 } 1062 1063 /* 1064 * Schedule the nfs_client asynchronous state management routine 1065 */ 1066 void nfs4_schedule_state_manager(struct nfs_client *clp) 1067 { 1068 struct task_struct *task; 1069 char buf[INET6_ADDRSTRLEN + sizeof("-manager") + 1]; 1070 1071 if (test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) != 0) 1072 return; 1073 __module_get(THIS_MODULE); 1074 atomic_inc(&clp->cl_count); 1075 1076 /* The rcu_read_lock() is not strictly necessary, as the state 1077 * manager is the only thread that ever changes the rpc_xprt 1078 * after it's initialized. At this point, we're single threaded. */ 1079 rcu_read_lock(); 1080 snprintf(buf, sizeof(buf), "%s-manager", 1081 rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_ADDR)); 1082 rcu_read_unlock(); 1083 task = kthread_run(nfs4_run_state_manager, clp, buf); 1084 if (IS_ERR(task)) { 1085 printk(KERN_ERR "%s: kthread_run: %ld\n", 1086 __func__, PTR_ERR(task)); 1087 nfs4_clear_state_manager_bit(clp); 1088 nfs_put_client(clp); 1089 module_put(THIS_MODULE); 1090 } 1091 } 1092 1093 /* 1094 * Schedule a lease recovery attempt 1095 */ 1096 void nfs4_schedule_lease_recovery(struct nfs_client *clp) 1097 { 1098 if (!clp) 1099 return; 1100 if (!test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) 1101 set_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state); 1102 nfs4_schedule_state_manager(clp); 1103 } 1104 EXPORT_SYMBOL_GPL(nfs4_schedule_lease_recovery); 1105 1106 /* 1107 * nfs40_handle_cb_pathdown - return all delegations after NFS4ERR_CB_PATH_DOWN 1108 * @clp: client to process 1109 * 1110 * Set the NFS4CLNT_LEASE_EXPIRED state in order to force a 1111 * resend of the SETCLIENTID and hence re-establish the 1112 * callback channel. Then return all existing delegations. 1113 */ 1114 static void nfs40_handle_cb_pathdown(struct nfs_client *clp) 1115 { 1116 set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); 1117 nfs_expire_all_delegations(clp); 1118 } 1119 1120 void nfs4_schedule_path_down_recovery(struct nfs_client *clp) 1121 { 1122 nfs40_handle_cb_pathdown(clp); 1123 nfs4_schedule_state_manager(clp); 1124 } 1125 1126 static int nfs4_state_mark_reclaim_reboot(struct nfs_client *clp, struct nfs4_state *state) 1127 { 1128 1129 set_bit(NFS_STATE_RECLAIM_REBOOT, &state->flags); 1130 /* Don't recover state that expired before the reboot */ 1131 if (test_bit(NFS_STATE_RECLAIM_NOGRACE, &state->flags)) { 1132 clear_bit(NFS_STATE_RECLAIM_REBOOT, &state->flags); 1133 return 0; 1134 } 1135 set_bit(NFS_OWNER_RECLAIM_REBOOT, &state->owner->so_flags); 1136 set_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state); 1137 return 1; 1138 } 1139 1140 static int nfs4_state_mark_reclaim_nograce(struct nfs_client *clp, struct nfs4_state *state) 1141 { 1142 set_bit(NFS_STATE_RECLAIM_NOGRACE, &state->flags); 1143 clear_bit(NFS_STATE_RECLAIM_REBOOT, &state->flags); 1144 set_bit(NFS_OWNER_RECLAIM_NOGRACE, &state->owner->so_flags); 1145 set_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state); 1146 return 1; 1147 } 1148 1149 void nfs4_schedule_stateid_recovery(const struct nfs_server *server, struct nfs4_state *state) 1150 { 1151 struct nfs_client *clp = server->nfs_client; 1152 1153 nfs4_state_mark_reclaim_nograce(clp, state); 1154 nfs4_schedule_state_manager(clp); 1155 } 1156 EXPORT_SYMBOL_GPL(nfs4_schedule_stateid_recovery); 1157 1158 void nfs_inode_find_state_and_recover(struct inode *inode, 1159 const nfs4_stateid *stateid) 1160 { 1161 struct nfs_client *clp = NFS_SERVER(inode)->nfs_client; 1162 struct nfs_inode *nfsi = NFS_I(inode); 1163 struct nfs_open_context *ctx; 1164 struct nfs4_state *state; 1165 bool found = false; 1166 1167 spin_lock(&inode->i_lock); 1168 list_for_each_entry(ctx, &nfsi->open_files, list) { 1169 state = ctx->state; 1170 if (state == NULL) 1171 continue; 1172 if (!test_bit(NFS_DELEGATED_STATE, &state->flags)) 1173 continue; 1174 if (!nfs4_stateid_match(&state->stateid, stateid)) 1175 continue; 1176 nfs4_state_mark_reclaim_nograce(clp, state); 1177 found = true; 1178 } 1179 spin_unlock(&inode->i_lock); 1180 if (found) 1181 nfs4_schedule_state_manager(clp); 1182 } 1183 1184 1185 static int nfs4_reclaim_locks(struct nfs4_state *state, const struct nfs4_state_recovery_ops *ops) 1186 { 1187 struct inode *inode = state->inode; 1188 struct nfs_inode *nfsi = NFS_I(inode); 1189 struct file_lock *fl; 1190 int status = 0; 1191 1192 if (inode->i_flock == NULL) 1193 return 0; 1194 1195 /* Guard against delegation returns and new lock/unlock calls */ 1196 down_write(&nfsi->rwsem); 1197 /* Protect inode->i_flock using the BKL */ 1198 lock_flocks(); 1199 for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) { 1200 if (!(fl->fl_flags & (FL_POSIX|FL_FLOCK))) 1201 continue; 1202 if (nfs_file_open_context(fl->fl_file)->state != state) 1203 continue; 1204 unlock_flocks(); 1205 status = ops->recover_lock(state, fl); 1206 switch (status) { 1207 case 0: 1208 break; 1209 case -ESTALE: 1210 case -NFS4ERR_ADMIN_REVOKED: 1211 case -NFS4ERR_STALE_STATEID: 1212 case -NFS4ERR_BAD_STATEID: 1213 case -NFS4ERR_EXPIRED: 1214 case -NFS4ERR_NO_GRACE: 1215 case -NFS4ERR_STALE_CLIENTID: 1216 case -NFS4ERR_BADSESSION: 1217 case -NFS4ERR_BADSLOT: 1218 case -NFS4ERR_BAD_HIGH_SLOT: 1219 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: 1220 goto out; 1221 default: 1222 printk(KERN_ERR "NFS: %s: unhandled error %d. " 1223 "Zeroing state\n", __func__, status); 1224 case -ENOMEM: 1225 case -NFS4ERR_DENIED: 1226 case -NFS4ERR_RECLAIM_BAD: 1227 case -NFS4ERR_RECLAIM_CONFLICT: 1228 /* kill_proc(fl->fl_pid, SIGLOST, 1); */ 1229 status = 0; 1230 } 1231 lock_flocks(); 1232 } 1233 unlock_flocks(); 1234 out: 1235 up_write(&nfsi->rwsem); 1236 return status; 1237 } 1238 1239 static int nfs4_reclaim_open_state(struct nfs4_state_owner *sp, const struct nfs4_state_recovery_ops *ops) 1240 { 1241 struct nfs4_state *state; 1242 struct nfs4_lock_state *lock; 1243 int status = 0; 1244 1245 /* Note: we rely on the sp->so_states list being ordered 1246 * so that we always reclaim open(O_RDWR) and/or open(O_WRITE) 1247 * states first. 1248 * This is needed to ensure that the server won't give us any 1249 * read delegations that we have to return if, say, we are 1250 * recovering after a network partition or a reboot from a 1251 * server that doesn't support a grace period. 1252 */ 1253 restart: 1254 spin_lock(&sp->so_lock); 1255 list_for_each_entry(state, &sp->so_states, open_states) { 1256 if (!test_and_clear_bit(ops->state_flag_bit, &state->flags)) 1257 continue; 1258 if (state->state == 0) 1259 continue; 1260 atomic_inc(&state->count); 1261 spin_unlock(&sp->so_lock); 1262 status = ops->recover_open(sp, state); 1263 if (status >= 0) { 1264 status = nfs4_reclaim_locks(state, ops); 1265 if (status >= 0) { 1266 spin_lock(&state->state_lock); 1267 list_for_each_entry(lock, &state->lock_states, ls_locks) { 1268 if (!(lock->ls_flags & NFS_LOCK_INITIALIZED)) 1269 pr_warn_ratelimited("NFS: " 1270 "%s: Lock reclaim " 1271 "failed!\n", __func__); 1272 } 1273 spin_unlock(&state->state_lock); 1274 nfs4_put_open_state(state); 1275 goto restart; 1276 } 1277 } 1278 switch (status) { 1279 default: 1280 printk(KERN_ERR "NFS: %s: unhandled error %d. " 1281 "Zeroing state\n", __func__, status); 1282 case -ENOENT: 1283 case -ENOMEM: 1284 case -ESTALE: 1285 /* 1286 * Open state on this file cannot be recovered 1287 * All we can do is revert to using the zero stateid. 1288 */ 1289 memset(&state->stateid, 0, 1290 sizeof(state->stateid)); 1291 /* Mark the file as being 'closed' */ 1292 state->state = 0; 1293 break; 1294 case -EKEYEXPIRED: 1295 /* 1296 * User RPCSEC_GSS context has expired. 1297 * We cannot recover this stateid now, so 1298 * skip it and allow recovery thread to 1299 * proceed. 1300 */ 1301 break; 1302 case -NFS4ERR_ADMIN_REVOKED: 1303 case -NFS4ERR_STALE_STATEID: 1304 case -NFS4ERR_BAD_STATEID: 1305 case -NFS4ERR_RECLAIM_BAD: 1306 case -NFS4ERR_RECLAIM_CONFLICT: 1307 nfs4_state_mark_reclaim_nograce(sp->so_server->nfs_client, state); 1308 break; 1309 case -NFS4ERR_EXPIRED: 1310 case -NFS4ERR_NO_GRACE: 1311 nfs4_state_mark_reclaim_nograce(sp->so_server->nfs_client, state); 1312 case -NFS4ERR_STALE_CLIENTID: 1313 case -NFS4ERR_BADSESSION: 1314 case -NFS4ERR_BADSLOT: 1315 case -NFS4ERR_BAD_HIGH_SLOT: 1316 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: 1317 goto out_err; 1318 } 1319 nfs4_put_open_state(state); 1320 goto restart; 1321 } 1322 spin_unlock(&sp->so_lock); 1323 return 0; 1324 out_err: 1325 nfs4_put_open_state(state); 1326 return status; 1327 } 1328 1329 static void nfs4_clear_open_state(struct nfs4_state *state) 1330 { 1331 struct nfs4_lock_state *lock; 1332 1333 clear_bit(NFS_DELEGATED_STATE, &state->flags); 1334 clear_bit(NFS_O_RDONLY_STATE, &state->flags); 1335 clear_bit(NFS_O_WRONLY_STATE, &state->flags); 1336 clear_bit(NFS_O_RDWR_STATE, &state->flags); 1337 spin_lock(&state->state_lock); 1338 list_for_each_entry(lock, &state->lock_states, ls_locks) { 1339 lock->ls_seqid.flags = 0; 1340 lock->ls_flags &= ~NFS_LOCK_INITIALIZED; 1341 } 1342 spin_unlock(&state->state_lock); 1343 } 1344 1345 static void nfs4_reset_seqids(struct nfs_server *server, 1346 int (*mark_reclaim)(struct nfs_client *clp, struct nfs4_state *state)) 1347 { 1348 struct nfs_client *clp = server->nfs_client; 1349 struct nfs4_state_owner *sp; 1350 struct rb_node *pos; 1351 struct nfs4_state *state; 1352 1353 spin_lock(&clp->cl_lock); 1354 for (pos = rb_first(&server->state_owners); 1355 pos != NULL; 1356 pos = rb_next(pos)) { 1357 sp = rb_entry(pos, struct nfs4_state_owner, so_server_node); 1358 sp->so_seqid.flags = 0; 1359 spin_lock(&sp->so_lock); 1360 list_for_each_entry(state, &sp->so_states, open_states) { 1361 if (mark_reclaim(clp, state)) 1362 nfs4_clear_open_state(state); 1363 } 1364 spin_unlock(&sp->so_lock); 1365 } 1366 spin_unlock(&clp->cl_lock); 1367 } 1368 1369 static void nfs4_state_mark_reclaim_helper(struct nfs_client *clp, 1370 int (*mark_reclaim)(struct nfs_client *clp, struct nfs4_state *state)) 1371 { 1372 struct nfs_server *server; 1373 1374 rcu_read_lock(); 1375 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) 1376 nfs4_reset_seqids(server, mark_reclaim); 1377 rcu_read_unlock(); 1378 } 1379 1380 static void nfs4_state_start_reclaim_reboot(struct nfs_client *clp) 1381 { 1382 /* Mark all delegations for reclaim */ 1383 nfs_delegation_mark_reclaim(clp); 1384 nfs4_state_mark_reclaim_helper(clp, nfs4_state_mark_reclaim_reboot); 1385 } 1386 1387 static void nfs4_reclaim_complete(struct nfs_client *clp, 1388 const struct nfs4_state_recovery_ops *ops) 1389 { 1390 /* Notify the server we're done reclaiming our state */ 1391 if (ops->reclaim_complete) 1392 (void)ops->reclaim_complete(clp); 1393 } 1394 1395 static void nfs4_clear_reclaim_server(struct nfs_server *server) 1396 { 1397 struct nfs_client *clp = server->nfs_client; 1398 struct nfs4_state_owner *sp; 1399 struct rb_node *pos; 1400 struct nfs4_state *state; 1401 1402 spin_lock(&clp->cl_lock); 1403 for (pos = rb_first(&server->state_owners); 1404 pos != NULL; 1405 pos = rb_next(pos)) { 1406 sp = rb_entry(pos, struct nfs4_state_owner, so_server_node); 1407 spin_lock(&sp->so_lock); 1408 list_for_each_entry(state, &sp->so_states, open_states) { 1409 if (!test_and_clear_bit(NFS_STATE_RECLAIM_REBOOT, 1410 &state->flags)) 1411 continue; 1412 nfs4_state_mark_reclaim_nograce(clp, state); 1413 } 1414 spin_unlock(&sp->so_lock); 1415 } 1416 spin_unlock(&clp->cl_lock); 1417 } 1418 1419 static int nfs4_state_clear_reclaim_reboot(struct nfs_client *clp) 1420 { 1421 struct nfs_server *server; 1422 1423 if (!test_and_clear_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state)) 1424 return 0; 1425 1426 rcu_read_lock(); 1427 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) 1428 nfs4_clear_reclaim_server(server); 1429 rcu_read_unlock(); 1430 1431 nfs_delegation_reap_unclaimed(clp); 1432 return 1; 1433 } 1434 1435 static void nfs4_state_end_reclaim_reboot(struct nfs_client *clp) 1436 { 1437 if (!nfs4_state_clear_reclaim_reboot(clp)) 1438 return; 1439 nfs4_reclaim_complete(clp, clp->cl_mvops->reboot_recovery_ops); 1440 } 1441 1442 static void nfs_delegation_clear_all(struct nfs_client *clp) 1443 { 1444 nfs_delegation_mark_reclaim(clp); 1445 nfs_delegation_reap_unclaimed(clp); 1446 } 1447 1448 static void nfs4_state_start_reclaim_nograce(struct nfs_client *clp) 1449 { 1450 nfs_delegation_clear_all(clp); 1451 nfs4_state_mark_reclaim_helper(clp, nfs4_state_mark_reclaim_nograce); 1452 } 1453 1454 static void nfs4_warn_keyexpired(const char *s) 1455 { 1456 printk_ratelimited(KERN_WARNING "Error: state manager" 1457 " encountered RPCSEC_GSS session" 1458 " expired against NFSv4 server %s.\n", 1459 s); 1460 } 1461 1462 static int nfs4_recovery_handle_error(struct nfs_client *clp, int error) 1463 { 1464 switch (error) { 1465 case 0: 1466 break; 1467 case -NFS4ERR_CB_PATH_DOWN: 1468 nfs40_handle_cb_pathdown(clp); 1469 break; 1470 case -NFS4ERR_NO_GRACE: 1471 nfs4_state_end_reclaim_reboot(clp); 1472 break; 1473 case -NFS4ERR_STALE_CLIENTID: 1474 case -NFS4ERR_LEASE_MOVED: 1475 set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); 1476 nfs4_state_clear_reclaim_reboot(clp); 1477 nfs4_state_start_reclaim_reboot(clp); 1478 break; 1479 case -NFS4ERR_EXPIRED: 1480 set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); 1481 nfs4_state_start_reclaim_nograce(clp); 1482 break; 1483 case -NFS4ERR_BADSESSION: 1484 case -NFS4ERR_BADSLOT: 1485 case -NFS4ERR_BAD_HIGH_SLOT: 1486 case -NFS4ERR_DEADSESSION: 1487 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: 1488 case -NFS4ERR_SEQ_FALSE_RETRY: 1489 case -NFS4ERR_SEQ_MISORDERED: 1490 set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state); 1491 /* Zero session reset errors */ 1492 break; 1493 case -EKEYEXPIRED: 1494 /* Nothing we can do */ 1495 nfs4_warn_keyexpired(clp->cl_hostname); 1496 break; 1497 default: 1498 return error; 1499 } 1500 return 0; 1501 } 1502 1503 static int nfs4_do_reclaim(struct nfs_client *clp, const struct nfs4_state_recovery_ops *ops) 1504 { 1505 struct nfs4_state_owner *sp; 1506 struct nfs_server *server; 1507 struct rb_node *pos; 1508 int status = 0; 1509 1510 restart: 1511 rcu_read_lock(); 1512 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { 1513 nfs4_purge_state_owners(server); 1514 spin_lock(&clp->cl_lock); 1515 for (pos = rb_first(&server->state_owners); 1516 pos != NULL; 1517 pos = rb_next(pos)) { 1518 sp = rb_entry(pos, 1519 struct nfs4_state_owner, so_server_node); 1520 if (!test_and_clear_bit(ops->owner_flag_bit, 1521 &sp->so_flags)) 1522 continue; 1523 atomic_inc(&sp->so_count); 1524 spin_unlock(&clp->cl_lock); 1525 rcu_read_unlock(); 1526 1527 status = nfs4_reclaim_open_state(sp, ops); 1528 if (status < 0) { 1529 set_bit(ops->owner_flag_bit, &sp->so_flags); 1530 nfs4_put_state_owner(sp); 1531 return nfs4_recovery_handle_error(clp, status); 1532 } 1533 1534 nfs4_put_state_owner(sp); 1535 goto restart; 1536 } 1537 spin_unlock(&clp->cl_lock); 1538 } 1539 rcu_read_unlock(); 1540 return status; 1541 } 1542 1543 static int nfs4_check_lease(struct nfs_client *clp) 1544 { 1545 struct rpc_cred *cred; 1546 const struct nfs4_state_maintenance_ops *ops = 1547 clp->cl_mvops->state_renewal_ops; 1548 int status; 1549 1550 /* Is the client already known to have an expired lease? */ 1551 if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) 1552 return 0; 1553 spin_lock(&clp->cl_lock); 1554 cred = ops->get_state_renewal_cred_locked(clp); 1555 spin_unlock(&clp->cl_lock); 1556 if (cred == NULL) { 1557 cred = nfs4_get_setclientid_cred(clp); 1558 status = -ENOKEY; 1559 if (cred == NULL) 1560 goto out; 1561 } 1562 status = ops->renew_lease(clp, cred); 1563 put_rpccred(cred); 1564 out: 1565 return nfs4_recovery_handle_error(clp, status); 1566 } 1567 1568 static int nfs4_reclaim_lease(struct nfs_client *clp) 1569 { 1570 struct rpc_cred *cred; 1571 const struct nfs4_state_recovery_ops *ops = 1572 clp->cl_mvops->reboot_recovery_ops; 1573 int status = -ENOENT; 1574 1575 cred = ops->get_clid_cred(clp); 1576 if (cred != NULL) { 1577 status = ops->establish_clid(clp, cred); 1578 put_rpccred(cred); 1579 /* Handle case where the user hasn't set up machine creds */ 1580 if (status == -EACCES && cred == clp->cl_machine_cred) { 1581 nfs4_clear_machine_cred(clp); 1582 status = -EAGAIN; 1583 } 1584 if (status == -NFS4ERR_MINOR_VERS_MISMATCH) 1585 status = -EPROTONOSUPPORT; 1586 } 1587 return status; 1588 } 1589 1590 #ifdef CONFIG_NFS_V4_1 1591 void nfs4_schedule_session_recovery(struct nfs4_session *session) 1592 { 1593 struct nfs_client *clp = session->clp; 1594 1595 set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state); 1596 nfs4_schedule_lease_recovery(clp); 1597 } 1598 EXPORT_SYMBOL_GPL(nfs4_schedule_session_recovery); 1599 1600 void nfs41_handle_recall_slot(struct nfs_client *clp) 1601 { 1602 set_bit(NFS4CLNT_RECALL_SLOT, &clp->cl_state); 1603 nfs4_schedule_state_manager(clp); 1604 } 1605 1606 static void nfs4_reset_all_state(struct nfs_client *clp) 1607 { 1608 if (test_and_set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) == 0) { 1609 clp->cl_boot_time = CURRENT_TIME; 1610 nfs4_state_start_reclaim_nograce(clp); 1611 nfs4_schedule_state_manager(clp); 1612 } 1613 } 1614 1615 static void nfs41_handle_server_reboot(struct nfs_client *clp) 1616 { 1617 if (test_and_set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) == 0) { 1618 nfs4_state_start_reclaim_reboot(clp); 1619 nfs4_schedule_state_manager(clp); 1620 } 1621 } 1622 1623 static void nfs41_handle_state_revoked(struct nfs_client *clp) 1624 { 1625 /* Temporary */ 1626 nfs4_reset_all_state(clp); 1627 } 1628 1629 static void nfs41_handle_recallable_state_revoked(struct nfs_client *clp) 1630 { 1631 /* This will need to handle layouts too */ 1632 nfs_expire_all_delegations(clp); 1633 } 1634 1635 static void nfs41_handle_cb_path_down(struct nfs_client *clp) 1636 { 1637 nfs_expire_all_delegations(clp); 1638 if (test_and_set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state) == 0) 1639 nfs4_schedule_state_manager(clp); 1640 } 1641 1642 void nfs41_handle_sequence_flag_errors(struct nfs_client *clp, u32 flags) 1643 { 1644 if (!flags) 1645 return; 1646 if (flags & SEQ4_STATUS_RESTART_RECLAIM_NEEDED) 1647 nfs41_handle_server_reboot(clp); 1648 if (flags & (SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED | 1649 SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED | 1650 SEQ4_STATUS_ADMIN_STATE_REVOKED | 1651 SEQ4_STATUS_LEASE_MOVED)) 1652 nfs41_handle_state_revoked(clp); 1653 if (flags & SEQ4_STATUS_RECALLABLE_STATE_REVOKED) 1654 nfs41_handle_recallable_state_revoked(clp); 1655 if (flags & (SEQ4_STATUS_CB_PATH_DOWN | 1656 SEQ4_STATUS_BACKCHANNEL_FAULT | 1657 SEQ4_STATUS_CB_PATH_DOWN_SESSION)) 1658 nfs41_handle_cb_path_down(clp); 1659 } 1660 1661 static int nfs4_reset_session(struct nfs_client *clp) 1662 { 1663 int status; 1664 1665 nfs4_begin_drain_session(clp); 1666 status = nfs4_proc_destroy_session(clp->cl_session); 1667 if (status && status != -NFS4ERR_BADSESSION && 1668 status != -NFS4ERR_DEADSESSION) { 1669 status = nfs4_recovery_handle_error(clp, status); 1670 goto out; 1671 } 1672 1673 memset(clp->cl_session->sess_id.data, 0, NFS4_MAX_SESSIONID_LEN); 1674 status = nfs4_proc_create_session(clp); 1675 if (status) { 1676 status = nfs4_recovery_handle_error(clp, status); 1677 goto out; 1678 } 1679 clear_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state); 1680 /* create_session negotiated new slot table */ 1681 clear_bit(NFS4CLNT_RECALL_SLOT, &clp->cl_state); 1682 1683 /* Let the state manager reestablish state */ 1684 if (!test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) 1685 nfs41_setup_state_renewal(clp); 1686 out: 1687 return status; 1688 } 1689 1690 static int nfs4_recall_slot(struct nfs_client *clp) 1691 { 1692 struct nfs4_slot_table *fc_tbl = &clp->cl_session->fc_slot_table; 1693 struct nfs4_channel_attrs *fc_attrs = &clp->cl_session->fc_attrs; 1694 struct nfs4_slot *new, *old; 1695 int i; 1696 1697 nfs4_begin_drain_session(clp); 1698 new = kmalloc(fc_tbl->target_max_slots * sizeof(struct nfs4_slot), 1699 GFP_NOFS); 1700 if (!new) 1701 return -ENOMEM; 1702 1703 spin_lock(&fc_tbl->slot_tbl_lock); 1704 for (i = 0; i < fc_tbl->target_max_slots; i++) 1705 new[i].seq_nr = fc_tbl->slots[i].seq_nr; 1706 old = fc_tbl->slots; 1707 fc_tbl->slots = new; 1708 fc_tbl->max_slots = fc_tbl->target_max_slots; 1709 fc_tbl->target_max_slots = 0; 1710 fc_attrs->max_reqs = fc_tbl->max_slots; 1711 spin_unlock(&fc_tbl->slot_tbl_lock); 1712 1713 kfree(old); 1714 nfs4_end_drain_session(clp); 1715 return 0; 1716 } 1717 1718 #else /* CONFIG_NFS_V4_1 */ 1719 static int nfs4_reset_session(struct nfs_client *clp) { return 0; } 1720 static int nfs4_end_drain_session(struct nfs_client *clp) { return 0; } 1721 static int nfs4_recall_slot(struct nfs_client *clp) { return 0; } 1722 #endif /* CONFIG_NFS_V4_1 */ 1723 1724 /* Set NFS4CLNT_LEASE_EXPIRED for all v4.0 errors and for recoverable errors 1725 * on EXCHANGE_ID for v4.1 1726 */ 1727 static void nfs4_set_lease_expired(struct nfs_client *clp, int status) 1728 { 1729 switch (status) { 1730 case -NFS4ERR_CLID_INUSE: 1731 case -NFS4ERR_STALE_CLIENTID: 1732 clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); 1733 break; 1734 case -NFS4ERR_DELAY: 1735 case -ETIMEDOUT: 1736 case -EAGAIN: 1737 ssleep(1); 1738 break; 1739 1740 case -EKEYEXPIRED: 1741 nfs4_warn_keyexpired(clp->cl_hostname); 1742 case -NFS4ERR_NOT_SAME: /* FixMe: implement recovery 1743 * in nfs4_exchange_id */ 1744 default: 1745 return; 1746 } 1747 set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); 1748 } 1749 1750 static void nfs4_state_manager(struct nfs_client *clp) 1751 { 1752 int status = 0; 1753 1754 /* Ensure exclusive access to NFSv4 state */ 1755 do { 1756 if (test_and_clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) { 1757 /* We're going to have to re-establish a clientid */ 1758 status = nfs4_reclaim_lease(clp); 1759 if (status) { 1760 nfs4_set_lease_expired(clp, status); 1761 if (test_bit(NFS4CLNT_LEASE_EXPIRED, 1762 &clp->cl_state)) 1763 continue; 1764 if (clp->cl_cons_state == 1765 NFS_CS_SESSION_INITING) 1766 nfs_mark_client_ready(clp, status); 1767 goto out_error; 1768 } 1769 clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state); 1770 1771 if (test_and_clear_bit(NFS4CLNT_SERVER_SCOPE_MISMATCH, 1772 &clp->cl_state)) 1773 nfs4_state_start_reclaim_nograce(clp); 1774 else 1775 set_bit(NFS4CLNT_RECLAIM_REBOOT, 1776 &clp->cl_state); 1777 1778 pnfs_destroy_all_layouts(clp); 1779 } 1780 1781 if (test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) { 1782 status = nfs4_check_lease(clp); 1783 if (status < 0) 1784 goto out_error; 1785 if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) 1786 continue; 1787 } 1788 1789 /* Initialize or reset the session */ 1790 if (test_and_clear_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state) 1791 && nfs4_has_session(clp)) { 1792 status = nfs4_reset_session(clp); 1793 if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) 1794 continue; 1795 if (status < 0) 1796 goto out_error; 1797 } 1798 1799 /* First recover reboot state... */ 1800 if (test_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state)) { 1801 status = nfs4_do_reclaim(clp, 1802 clp->cl_mvops->reboot_recovery_ops); 1803 if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) || 1804 test_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state)) 1805 continue; 1806 nfs4_state_end_reclaim_reboot(clp); 1807 if (test_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state)) 1808 continue; 1809 if (status < 0) 1810 goto out_error; 1811 } 1812 1813 /* Now recover expired state... */ 1814 if (test_and_clear_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state)) { 1815 status = nfs4_do_reclaim(clp, 1816 clp->cl_mvops->nograce_recovery_ops); 1817 if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) || 1818 test_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state) || 1819 test_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state)) 1820 continue; 1821 if (status < 0) 1822 goto out_error; 1823 } 1824 1825 nfs4_end_drain_session(clp); 1826 if (test_and_clear_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state)) { 1827 nfs_client_return_marked_delegations(clp); 1828 continue; 1829 } 1830 /* Recall session slots */ 1831 if (test_and_clear_bit(NFS4CLNT_RECALL_SLOT, &clp->cl_state) 1832 && nfs4_has_session(clp)) { 1833 status = nfs4_recall_slot(clp); 1834 if (status < 0) 1835 goto out_error; 1836 continue; 1837 } 1838 1839 1840 nfs4_clear_state_manager_bit(clp); 1841 /* Did we race with an attempt to give us more work? */ 1842 if (clp->cl_state == 0) 1843 break; 1844 if (test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) != 0) 1845 break; 1846 } while (atomic_read(&clp->cl_count) > 1); 1847 return; 1848 out_error: 1849 pr_warn_ratelimited("NFS: state manager failed on NFSv4 server %s" 1850 " with error %d\n", clp->cl_hostname, -status); 1851 nfs4_end_drain_session(clp); 1852 nfs4_clear_state_manager_bit(clp); 1853 } 1854 1855 static int nfs4_run_state_manager(void *ptr) 1856 { 1857 struct nfs_client *clp = ptr; 1858 1859 allow_signal(SIGKILL); 1860 nfs4_state_manager(clp); 1861 nfs_put_client(clp); 1862 module_put_and_exit(0); 1863 return 0; 1864 } 1865 1866 /* 1867 * Local variables: 1868 * c-basic-offset: 8 1869 * End: 1870 */ 1871