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