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