1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * linux/fs/nfs/delegation.c 4 * 5 * Copyright (C) 2004 Trond Myklebust 6 * 7 * NFS file delegation management 8 * 9 */ 10 #include <linux/completion.h> 11 #include <linux/kthread.h> 12 #include <linux/module.h> 13 #include <linux/sched.h> 14 #include <linux/slab.h> 15 #include <linux/spinlock.h> 16 #include <linux/iversion.h> 17 18 #include <linux/nfs4.h> 19 #include <linux/nfs_fs.h> 20 #include <linux/nfs_xdr.h> 21 22 #include "nfs4_fs.h" 23 #include "nfs4session.h" 24 #include "delegation.h" 25 #include "internal.h" 26 #include "nfs4trace.h" 27 28 static void nfs_free_delegation(struct nfs_delegation *delegation) 29 { 30 put_cred(delegation->cred); 31 delegation->cred = NULL; 32 kfree_rcu(delegation, rcu); 33 } 34 35 /** 36 * nfs_mark_delegation_referenced - set delegation's REFERENCED flag 37 * @delegation: delegation to process 38 * 39 */ 40 void nfs_mark_delegation_referenced(struct nfs_delegation *delegation) 41 { 42 set_bit(NFS_DELEGATION_REFERENCED, &delegation->flags); 43 } 44 45 static bool 46 nfs4_is_valid_delegation(const struct nfs_delegation *delegation, 47 fmode_t flags) 48 { 49 if (delegation != NULL && (delegation->type & flags) == flags && 50 !test_bit(NFS_DELEGATION_REVOKED, &delegation->flags) && 51 !test_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) 52 return true; 53 return false; 54 } 55 56 struct nfs_delegation *nfs4_get_valid_delegation(const struct inode *inode) 57 { 58 struct nfs_delegation *delegation; 59 60 delegation = rcu_dereference(NFS_I(inode)->delegation); 61 if (nfs4_is_valid_delegation(delegation, 0)) 62 return delegation; 63 return NULL; 64 } 65 66 static int 67 nfs4_do_check_delegation(struct inode *inode, fmode_t flags, bool mark) 68 { 69 struct nfs_delegation *delegation; 70 int ret = 0; 71 72 flags &= FMODE_READ|FMODE_WRITE; 73 rcu_read_lock(); 74 delegation = rcu_dereference(NFS_I(inode)->delegation); 75 if (nfs4_is_valid_delegation(delegation, flags)) { 76 if (mark) 77 nfs_mark_delegation_referenced(delegation); 78 ret = 1; 79 } 80 rcu_read_unlock(); 81 return ret; 82 } 83 /** 84 * nfs_have_delegation - check if inode has a delegation, mark it 85 * NFS_DELEGATION_REFERENCED if there is one. 86 * @inode: inode to check 87 * @flags: delegation types to check for 88 * 89 * Returns one if inode has the indicated delegation, otherwise zero. 90 */ 91 int nfs4_have_delegation(struct inode *inode, fmode_t flags) 92 { 93 return nfs4_do_check_delegation(inode, flags, true); 94 } 95 96 /* 97 * nfs4_check_delegation - check if inode has a delegation, do not mark 98 * NFS_DELEGATION_REFERENCED if it has one. 99 */ 100 int nfs4_check_delegation(struct inode *inode, fmode_t flags) 101 { 102 return nfs4_do_check_delegation(inode, flags, false); 103 } 104 105 static int nfs_delegation_claim_locks(struct nfs4_state *state, const nfs4_stateid *stateid) 106 { 107 struct inode *inode = state->inode; 108 struct file_lock *fl; 109 struct file_lock_context *flctx = inode->i_flctx; 110 struct list_head *list; 111 int status = 0; 112 113 if (flctx == NULL) 114 goto out; 115 116 list = &flctx->flc_posix; 117 spin_lock(&flctx->flc_lock); 118 restart: 119 list_for_each_entry(fl, list, fl_list) { 120 if (nfs_file_open_context(fl->fl_file)->state != state) 121 continue; 122 spin_unlock(&flctx->flc_lock); 123 status = nfs4_lock_delegation_recall(fl, state, stateid); 124 if (status < 0) 125 goto out; 126 spin_lock(&flctx->flc_lock); 127 } 128 if (list == &flctx->flc_posix) { 129 list = &flctx->flc_flock; 130 goto restart; 131 } 132 spin_unlock(&flctx->flc_lock); 133 out: 134 return status; 135 } 136 137 static int nfs_delegation_claim_opens(struct inode *inode, 138 const nfs4_stateid *stateid, fmode_t type) 139 { 140 struct nfs_inode *nfsi = NFS_I(inode); 141 struct nfs_open_context *ctx; 142 struct nfs4_state_owner *sp; 143 struct nfs4_state *state; 144 unsigned int seq; 145 int err; 146 147 again: 148 rcu_read_lock(); 149 list_for_each_entry_rcu(ctx, &nfsi->open_files, list) { 150 state = ctx->state; 151 if (state == NULL) 152 continue; 153 if (!test_bit(NFS_DELEGATED_STATE, &state->flags)) 154 continue; 155 if (!nfs4_valid_open_stateid(state)) 156 continue; 157 if (!nfs4_stateid_match(&state->stateid, stateid)) 158 continue; 159 if (!get_nfs_open_context(ctx)) 160 continue; 161 rcu_read_unlock(); 162 sp = state->owner; 163 /* Block nfs4_proc_unlck */ 164 mutex_lock(&sp->so_delegreturn_mutex); 165 seq = raw_seqcount_begin(&sp->so_reclaim_seqcount); 166 err = nfs4_open_delegation_recall(ctx, state, stateid); 167 if (!err) 168 err = nfs_delegation_claim_locks(state, stateid); 169 if (!err && read_seqcount_retry(&sp->so_reclaim_seqcount, seq)) 170 err = -EAGAIN; 171 mutex_unlock(&sp->so_delegreturn_mutex); 172 put_nfs_open_context(ctx); 173 if (err != 0) 174 return err; 175 goto again; 176 } 177 rcu_read_unlock(); 178 return 0; 179 } 180 181 /** 182 * nfs_inode_reclaim_delegation - process a delegation reclaim request 183 * @inode: inode to process 184 * @cred: credential to use for request 185 * @type: delegation type 186 * @stateid: delegation stateid 187 * @pagemod_limit: write delegation "space_limit" 188 * 189 */ 190 void nfs_inode_reclaim_delegation(struct inode *inode, const struct cred *cred, 191 fmode_t type, 192 const nfs4_stateid *stateid, 193 unsigned long pagemod_limit) 194 { 195 struct nfs_delegation *delegation; 196 const struct cred *oldcred = NULL; 197 198 rcu_read_lock(); 199 delegation = rcu_dereference(NFS_I(inode)->delegation); 200 if (delegation != NULL) { 201 spin_lock(&delegation->lock); 202 if (nfs4_is_valid_delegation(delegation, 0)) { 203 nfs4_stateid_copy(&delegation->stateid, stateid); 204 delegation->type = type; 205 delegation->pagemod_limit = pagemod_limit; 206 oldcred = delegation->cred; 207 delegation->cred = get_cred(cred); 208 clear_bit(NFS_DELEGATION_NEED_RECLAIM, 209 &delegation->flags); 210 spin_unlock(&delegation->lock); 211 rcu_read_unlock(); 212 put_cred(oldcred); 213 trace_nfs4_reclaim_delegation(inode, type); 214 return; 215 } 216 /* We appear to have raced with a delegation return. */ 217 spin_unlock(&delegation->lock); 218 } 219 rcu_read_unlock(); 220 nfs_inode_set_delegation(inode, cred, type, stateid, pagemod_limit); 221 } 222 223 static int nfs_do_return_delegation(struct inode *inode, struct nfs_delegation *delegation, int issync) 224 { 225 int res = 0; 226 227 if (!test_bit(NFS_DELEGATION_REVOKED, &delegation->flags)) 228 res = nfs4_proc_delegreturn(inode, 229 delegation->cred, 230 &delegation->stateid, 231 issync); 232 return res; 233 } 234 235 static struct inode *nfs_delegation_grab_inode(struct nfs_delegation *delegation) 236 { 237 struct inode *inode = NULL; 238 239 spin_lock(&delegation->lock); 240 if (delegation->inode != NULL) 241 inode = igrab(delegation->inode); 242 if (!inode) 243 set_bit(NFS_DELEGATION_INODE_FREEING, &delegation->flags); 244 spin_unlock(&delegation->lock); 245 return inode; 246 } 247 248 static struct nfs_delegation * 249 nfs_start_delegation_return_locked(struct nfs_inode *nfsi) 250 { 251 struct nfs_delegation *ret = NULL; 252 struct nfs_delegation *delegation = rcu_dereference(nfsi->delegation); 253 254 if (delegation == NULL) 255 goto out; 256 spin_lock(&delegation->lock); 257 if (!test_and_set_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) 258 ret = delegation; 259 spin_unlock(&delegation->lock); 260 out: 261 return ret; 262 } 263 264 static struct nfs_delegation * 265 nfs_start_delegation_return(struct nfs_inode *nfsi) 266 { 267 struct nfs_delegation *delegation; 268 269 rcu_read_lock(); 270 delegation = nfs_start_delegation_return_locked(nfsi); 271 rcu_read_unlock(); 272 return delegation; 273 } 274 275 static void 276 nfs_abort_delegation_return(struct nfs_delegation *delegation, 277 struct nfs_client *clp) 278 { 279 280 spin_lock(&delegation->lock); 281 clear_bit(NFS_DELEGATION_RETURNING, &delegation->flags); 282 set_bit(NFS_DELEGATION_RETURN, &delegation->flags); 283 spin_unlock(&delegation->lock); 284 set_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state); 285 } 286 287 static struct nfs_delegation * 288 nfs_detach_delegation_locked(struct nfs_inode *nfsi, 289 struct nfs_delegation *delegation, 290 struct nfs_client *clp) 291 { 292 struct nfs_delegation *deleg_cur = 293 rcu_dereference_protected(nfsi->delegation, 294 lockdep_is_held(&clp->cl_lock)); 295 296 if (deleg_cur == NULL || delegation != deleg_cur) 297 return NULL; 298 299 spin_lock(&delegation->lock); 300 if (!delegation->inode) { 301 spin_unlock(&delegation->lock); 302 return NULL; 303 } 304 list_del_rcu(&delegation->super_list); 305 delegation->inode = NULL; 306 rcu_assign_pointer(nfsi->delegation, NULL); 307 spin_unlock(&delegation->lock); 308 return delegation; 309 } 310 311 static struct nfs_delegation *nfs_detach_delegation(struct nfs_inode *nfsi, 312 struct nfs_delegation *delegation, 313 struct nfs_server *server) 314 { 315 struct nfs_client *clp = server->nfs_client; 316 317 spin_lock(&clp->cl_lock); 318 delegation = nfs_detach_delegation_locked(nfsi, delegation, clp); 319 spin_unlock(&clp->cl_lock); 320 return delegation; 321 } 322 323 static struct nfs_delegation * 324 nfs_inode_detach_delegation(struct inode *inode) 325 { 326 struct nfs_inode *nfsi = NFS_I(inode); 327 struct nfs_server *server = NFS_SERVER(inode); 328 struct nfs_delegation *delegation; 329 330 rcu_read_lock(); 331 delegation = rcu_dereference(nfsi->delegation); 332 if (delegation != NULL) 333 delegation = nfs_detach_delegation(nfsi, delegation, server); 334 rcu_read_unlock(); 335 return delegation; 336 } 337 338 static void 339 nfs_update_inplace_delegation(struct nfs_delegation *delegation, 340 const struct nfs_delegation *update) 341 { 342 if (nfs4_stateid_is_newer(&update->stateid, &delegation->stateid)) { 343 delegation->stateid.seqid = update->stateid.seqid; 344 smp_wmb(); 345 delegation->type = update->type; 346 clear_bit(NFS_DELEGATION_REVOKED, &delegation->flags); 347 } 348 } 349 350 /** 351 * nfs_inode_set_delegation - set up a delegation on an inode 352 * @inode: inode to which delegation applies 353 * @cred: cred to use for subsequent delegation processing 354 * @type: delegation type 355 * @stateid: delegation stateid 356 * @pagemod_limit: write delegation "space_limit" 357 * 358 * Returns zero on success, or a negative errno value. 359 */ 360 int nfs_inode_set_delegation(struct inode *inode, const struct cred *cred, 361 fmode_t type, 362 const nfs4_stateid *stateid, 363 unsigned long pagemod_limit) 364 { 365 struct nfs_server *server = NFS_SERVER(inode); 366 struct nfs_client *clp = server->nfs_client; 367 struct nfs_inode *nfsi = NFS_I(inode); 368 struct nfs_delegation *delegation, *old_delegation; 369 struct nfs_delegation *freeme = NULL; 370 int status = 0; 371 372 delegation = kmalloc(sizeof(*delegation), GFP_NOFS); 373 if (delegation == NULL) 374 return -ENOMEM; 375 nfs4_stateid_copy(&delegation->stateid, stateid); 376 delegation->type = type; 377 delegation->pagemod_limit = pagemod_limit; 378 delegation->change_attr = inode_peek_iversion_raw(inode); 379 delegation->cred = get_cred(cred); 380 delegation->inode = inode; 381 delegation->flags = 1<<NFS_DELEGATION_REFERENCED; 382 spin_lock_init(&delegation->lock); 383 384 spin_lock(&clp->cl_lock); 385 old_delegation = rcu_dereference_protected(nfsi->delegation, 386 lockdep_is_held(&clp->cl_lock)); 387 if (old_delegation == NULL) 388 goto add_new; 389 /* Is this an update of the existing delegation? */ 390 if (nfs4_stateid_match_other(&old_delegation->stateid, 391 &delegation->stateid)) { 392 spin_lock(&old_delegation->lock); 393 nfs_update_inplace_delegation(old_delegation, 394 delegation); 395 spin_unlock(&old_delegation->lock); 396 goto out; 397 } 398 if (!test_bit(NFS_DELEGATION_REVOKED, &old_delegation->flags)) { 399 /* 400 * Deal with broken servers that hand out two 401 * delegations for the same file. 402 * Allow for upgrades to a WRITE delegation, but 403 * nothing else. 404 */ 405 dfprintk(FILE, "%s: server %s handed out " 406 "a duplicate delegation!\n", 407 __func__, clp->cl_hostname); 408 if (delegation->type == old_delegation->type || 409 !(delegation->type & FMODE_WRITE)) { 410 freeme = delegation; 411 delegation = NULL; 412 goto out; 413 } 414 if (test_and_set_bit(NFS_DELEGATION_RETURNING, 415 &old_delegation->flags)) 416 goto out; 417 } 418 freeme = nfs_detach_delegation_locked(nfsi, old_delegation, clp); 419 if (freeme == NULL) 420 goto out; 421 add_new: 422 list_add_tail_rcu(&delegation->super_list, &server->delegations); 423 rcu_assign_pointer(nfsi->delegation, delegation); 424 delegation = NULL; 425 426 trace_nfs4_set_delegation(inode, type); 427 428 spin_lock(&inode->i_lock); 429 if (NFS_I(inode)->cache_validity & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ATIME)) 430 NFS_I(inode)->cache_validity |= NFS_INO_REVAL_FORCED; 431 spin_unlock(&inode->i_lock); 432 out: 433 spin_unlock(&clp->cl_lock); 434 if (delegation != NULL) 435 nfs_free_delegation(delegation); 436 if (freeme != NULL) { 437 nfs_do_return_delegation(inode, freeme, 0); 438 nfs_free_delegation(freeme); 439 } 440 return status; 441 } 442 443 /* 444 * Basic procedure for returning a delegation to the server 445 */ 446 static int nfs_end_delegation_return(struct inode *inode, struct nfs_delegation *delegation, int issync) 447 { 448 struct nfs_client *clp = NFS_SERVER(inode)->nfs_client; 449 int err = 0; 450 451 if (delegation == NULL) 452 return 0; 453 do { 454 if (test_bit(NFS_DELEGATION_REVOKED, &delegation->flags)) 455 break; 456 err = nfs_delegation_claim_opens(inode, &delegation->stateid, 457 delegation->type); 458 if (!issync || err != -EAGAIN) 459 break; 460 /* 461 * Guard against state recovery 462 */ 463 err = nfs4_wait_clnt_recover(clp); 464 } while (err == 0); 465 466 if (err) { 467 nfs_abort_delegation_return(delegation, clp); 468 goto out; 469 } 470 471 err = nfs_do_return_delegation(inode, delegation, issync); 472 out: 473 return err; 474 } 475 476 static bool nfs_delegation_need_return(struct nfs_delegation *delegation) 477 { 478 bool ret = false; 479 480 if (test_and_clear_bit(NFS_DELEGATION_RETURN, &delegation->flags)) 481 ret = true; 482 if (test_and_clear_bit(NFS_DELEGATION_RETURN_IF_CLOSED, &delegation->flags) && !ret) { 483 struct inode *inode; 484 485 spin_lock(&delegation->lock); 486 inode = delegation->inode; 487 if (inode && list_empty(&NFS_I(inode)->open_files)) 488 ret = true; 489 spin_unlock(&delegation->lock); 490 } 491 if (test_bit(NFS_DELEGATION_RETURNING, &delegation->flags) || 492 test_bit(NFS_DELEGATION_REVOKED, &delegation->flags)) 493 ret = false; 494 495 return ret; 496 } 497 498 /** 499 * nfs_client_return_marked_delegations - return previously marked delegations 500 * @clp: nfs_client to process 501 * 502 * Note that this function is designed to be called by the state 503 * manager thread. For this reason, it cannot flush the dirty data, 504 * since that could deadlock in case of a state recovery error. 505 * 506 * Returns zero on success, or a negative errno value. 507 */ 508 int nfs_client_return_marked_delegations(struct nfs_client *clp) 509 { 510 struct nfs_delegation *delegation; 511 struct nfs_delegation *prev; 512 struct nfs_server *server; 513 struct inode *inode; 514 struct inode *place_holder = NULL; 515 struct nfs_delegation *place_holder_deleg = NULL; 516 int err = 0; 517 518 restart: 519 /* 520 * To avoid quadratic looping we hold a reference 521 * to an inode place_holder. Each time we restart, we 522 * list nfs_servers from the server of that inode, and 523 * delegation in the server from the delegations of that 524 * inode. 525 * prev is an RCU-protected pointer to a delegation which 526 * wasn't marked for return and might be a good choice for 527 * the next place_holder. 528 */ 529 rcu_read_lock(); 530 prev = NULL; 531 if (place_holder) 532 server = NFS_SERVER(place_holder); 533 else 534 server = list_entry_rcu(clp->cl_superblocks.next, 535 struct nfs_server, client_link); 536 list_for_each_entry_from_rcu(server, &clp->cl_superblocks, client_link) { 537 delegation = NULL; 538 if (place_holder && server == NFS_SERVER(place_holder)) 539 delegation = rcu_dereference(NFS_I(place_holder)->delegation); 540 if (!delegation || delegation != place_holder_deleg) 541 delegation = list_entry_rcu(server->delegations.next, 542 struct nfs_delegation, super_list); 543 list_for_each_entry_from_rcu(delegation, &server->delegations, super_list) { 544 struct inode *to_put = NULL; 545 546 if (!nfs_delegation_need_return(delegation)) { 547 prev = delegation; 548 continue; 549 } 550 if (!nfs_sb_active(server->super)) 551 break; /* continue in outer loop */ 552 553 if (prev) { 554 struct inode *tmp; 555 556 tmp = nfs_delegation_grab_inode(prev); 557 if (tmp) { 558 to_put = place_holder; 559 place_holder = tmp; 560 place_holder_deleg = prev; 561 } 562 } 563 564 inode = nfs_delegation_grab_inode(delegation); 565 if (inode == NULL) { 566 rcu_read_unlock(); 567 if (to_put) 568 iput(to_put); 569 nfs_sb_deactive(server->super); 570 goto restart; 571 } 572 delegation = nfs_start_delegation_return_locked(NFS_I(inode)); 573 rcu_read_unlock(); 574 575 if (to_put) 576 iput(to_put); 577 578 err = nfs_end_delegation_return(inode, delegation, 0); 579 iput(inode); 580 nfs_sb_deactive(server->super); 581 cond_resched(); 582 if (!err) 583 goto restart; 584 set_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state); 585 if (place_holder) 586 iput(place_holder); 587 return err; 588 } 589 } 590 rcu_read_unlock(); 591 if (place_holder) 592 iput(place_holder); 593 return 0; 594 } 595 596 /** 597 * nfs_inode_evict_delegation - return delegation, don't reclaim opens 598 * @inode: inode to process 599 * 600 * Does not protect against delegation reclaims, therefore really only safe 601 * to be called from nfs4_clear_inode(). Guaranteed to always free 602 * the delegation structure. 603 */ 604 void nfs_inode_evict_delegation(struct inode *inode) 605 { 606 struct nfs_delegation *delegation; 607 608 delegation = nfs_inode_detach_delegation(inode); 609 if (delegation != NULL) { 610 set_bit(NFS_DELEGATION_INODE_FREEING, &delegation->flags); 611 nfs_do_return_delegation(inode, delegation, 1); 612 nfs_free_delegation(delegation); 613 } 614 } 615 616 /** 617 * nfs_inode_return_delegation - synchronously return a delegation 618 * @inode: inode to process 619 * 620 * This routine will always flush any dirty data to disk on the 621 * assumption that if we need to return the delegation, then 622 * we should stop caching. 623 * 624 * Returns zero on success, or a negative errno value. 625 */ 626 int nfs4_inode_return_delegation(struct inode *inode) 627 { 628 struct nfs_inode *nfsi = NFS_I(inode); 629 struct nfs_delegation *delegation; 630 int err = 0; 631 632 nfs_wb_all(inode); 633 delegation = nfs_start_delegation_return(nfsi); 634 if (delegation != NULL) 635 err = nfs_end_delegation_return(inode, delegation, 1); 636 return err; 637 } 638 639 /** 640 * nfs4_inode_make_writeable 641 * @inode: pointer to inode 642 * 643 * Make the inode writeable by returning the delegation if necessary 644 * 645 * Returns zero on success, or a negative errno value. 646 */ 647 int nfs4_inode_make_writeable(struct inode *inode) 648 { 649 struct nfs_delegation *delegation; 650 651 rcu_read_lock(); 652 delegation = nfs4_get_valid_delegation(inode); 653 if (delegation == NULL || 654 (nfs4_has_session(NFS_SERVER(inode)->nfs_client) && 655 (delegation->type & FMODE_WRITE))) { 656 rcu_read_unlock(); 657 return 0; 658 } 659 rcu_read_unlock(); 660 return nfs4_inode_return_delegation(inode); 661 } 662 663 static void nfs_mark_return_if_closed_delegation(struct nfs_server *server, 664 struct nfs_delegation *delegation) 665 { 666 set_bit(NFS_DELEGATION_RETURN_IF_CLOSED, &delegation->flags); 667 set_bit(NFS4CLNT_DELEGRETURN, &server->nfs_client->cl_state); 668 } 669 670 static void nfs_mark_return_delegation(struct nfs_server *server, 671 struct nfs_delegation *delegation) 672 { 673 set_bit(NFS_DELEGATION_RETURN, &delegation->flags); 674 set_bit(NFS4CLNT_DELEGRETURN, &server->nfs_client->cl_state); 675 } 676 677 static bool nfs_server_mark_return_all_delegations(struct nfs_server *server) 678 { 679 struct nfs_delegation *delegation; 680 bool ret = false; 681 682 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { 683 nfs_mark_return_delegation(server, delegation); 684 ret = true; 685 } 686 return ret; 687 } 688 689 static void nfs_client_mark_return_all_delegations(struct nfs_client *clp) 690 { 691 struct nfs_server *server; 692 693 rcu_read_lock(); 694 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) 695 nfs_server_mark_return_all_delegations(server); 696 rcu_read_unlock(); 697 } 698 699 static void nfs_delegation_run_state_manager(struct nfs_client *clp) 700 { 701 if (test_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state)) 702 nfs4_schedule_state_manager(clp); 703 } 704 705 /** 706 * nfs_expire_all_delegations 707 * @clp: client to process 708 * 709 */ 710 void nfs_expire_all_delegations(struct nfs_client *clp) 711 { 712 nfs_client_mark_return_all_delegations(clp); 713 nfs_delegation_run_state_manager(clp); 714 } 715 716 /** 717 * nfs_super_return_all_delegations - return delegations for one superblock 718 * @server: pointer to nfs_server to process 719 * 720 */ 721 void nfs_server_return_all_delegations(struct nfs_server *server) 722 { 723 struct nfs_client *clp = server->nfs_client; 724 bool need_wait; 725 726 if (clp == NULL) 727 return; 728 729 rcu_read_lock(); 730 need_wait = nfs_server_mark_return_all_delegations(server); 731 rcu_read_unlock(); 732 733 if (need_wait) { 734 nfs4_schedule_state_manager(clp); 735 nfs4_wait_clnt_recover(clp); 736 } 737 } 738 739 static void nfs_mark_return_unused_delegation_types(struct nfs_server *server, 740 fmode_t flags) 741 { 742 struct nfs_delegation *delegation; 743 744 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { 745 if ((delegation->type == (FMODE_READ|FMODE_WRITE)) && !(flags & FMODE_WRITE)) 746 continue; 747 if (delegation->type & flags) 748 nfs_mark_return_if_closed_delegation(server, delegation); 749 } 750 } 751 752 static void nfs_client_mark_return_unused_delegation_types(struct nfs_client *clp, 753 fmode_t flags) 754 { 755 struct nfs_server *server; 756 757 rcu_read_lock(); 758 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) 759 nfs_mark_return_unused_delegation_types(server, flags); 760 rcu_read_unlock(); 761 } 762 763 static void nfs_mark_delegation_revoked(struct nfs_server *server, 764 struct nfs_delegation *delegation) 765 { 766 set_bit(NFS_DELEGATION_REVOKED, &delegation->flags); 767 delegation->stateid.type = NFS4_INVALID_STATEID_TYPE; 768 } 769 770 static void nfs_revoke_delegation(struct inode *inode, 771 const nfs4_stateid *stateid) 772 { 773 struct nfs_delegation *delegation; 774 nfs4_stateid tmp; 775 bool ret = false; 776 777 rcu_read_lock(); 778 delegation = rcu_dereference(NFS_I(inode)->delegation); 779 if (delegation == NULL) 780 goto out; 781 if (stateid == NULL) { 782 nfs4_stateid_copy(&tmp, &delegation->stateid); 783 stateid = &tmp; 784 } else { 785 if (!nfs4_stateid_match_other(stateid, &delegation->stateid)) 786 goto out; 787 spin_lock(&delegation->lock); 788 if (stateid->seqid) { 789 if (nfs4_stateid_is_newer(&delegation->stateid, stateid)) { 790 spin_unlock(&delegation->lock); 791 goto out; 792 } 793 delegation->stateid.seqid = stateid->seqid; 794 } 795 spin_unlock(&delegation->lock); 796 } 797 nfs_mark_delegation_revoked(NFS_SERVER(inode), delegation); 798 ret = true; 799 out: 800 rcu_read_unlock(); 801 if (ret) 802 nfs_inode_find_state_and_recover(inode, stateid); 803 } 804 805 void nfs_remove_bad_delegation(struct inode *inode, 806 const nfs4_stateid *stateid) 807 { 808 nfs_revoke_delegation(inode, stateid); 809 } 810 EXPORT_SYMBOL_GPL(nfs_remove_bad_delegation); 811 812 void nfs_delegation_mark_returned(struct inode *inode, 813 const nfs4_stateid *stateid) 814 { 815 struct nfs_delegation *delegation; 816 817 if (!inode) 818 return; 819 820 rcu_read_lock(); 821 delegation = rcu_dereference(NFS_I(inode)->delegation); 822 if (!delegation) 823 goto out_rcu_unlock; 824 825 spin_lock(&delegation->lock); 826 if (!nfs4_stateid_match_other(stateid, &delegation->stateid)) 827 goto out_spin_unlock; 828 if (stateid->seqid) { 829 /* If delegation->stateid is newer, dont mark as returned */ 830 if (nfs4_stateid_is_newer(&delegation->stateid, stateid)) 831 goto out_clear_returning; 832 if (delegation->stateid.seqid != stateid->seqid) 833 delegation->stateid.seqid = stateid->seqid; 834 } 835 836 nfs_mark_delegation_revoked(NFS_SERVER(inode), delegation); 837 838 out_clear_returning: 839 clear_bit(NFS_DELEGATION_RETURNING, &delegation->flags); 840 out_spin_unlock: 841 spin_unlock(&delegation->lock); 842 out_rcu_unlock: 843 rcu_read_unlock(); 844 845 nfs_inode_find_state_and_recover(inode, stateid); 846 } 847 848 /** 849 * nfs_expire_unused_delegation_types 850 * @clp: client to process 851 * @flags: delegation types to expire 852 * 853 */ 854 void nfs_expire_unused_delegation_types(struct nfs_client *clp, fmode_t flags) 855 { 856 nfs_client_mark_return_unused_delegation_types(clp, flags); 857 nfs_delegation_run_state_manager(clp); 858 } 859 860 static void nfs_mark_return_unreferenced_delegations(struct nfs_server *server) 861 { 862 struct nfs_delegation *delegation; 863 864 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { 865 if (test_and_clear_bit(NFS_DELEGATION_REFERENCED, &delegation->flags)) 866 continue; 867 nfs_mark_return_if_closed_delegation(server, delegation); 868 } 869 } 870 871 /** 872 * nfs_expire_unreferenced_delegations - Eliminate unused delegations 873 * @clp: nfs_client to process 874 * 875 */ 876 void nfs_expire_unreferenced_delegations(struct nfs_client *clp) 877 { 878 struct nfs_server *server; 879 880 rcu_read_lock(); 881 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) 882 nfs_mark_return_unreferenced_delegations(server); 883 rcu_read_unlock(); 884 885 nfs_delegation_run_state_manager(clp); 886 } 887 888 /** 889 * nfs_async_inode_return_delegation - asynchronously return a delegation 890 * @inode: inode to process 891 * @stateid: state ID information 892 * 893 * Returns zero on success, or a negative errno value. 894 */ 895 int nfs_async_inode_return_delegation(struct inode *inode, 896 const nfs4_stateid *stateid) 897 { 898 struct nfs_server *server = NFS_SERVER(inode); 899 struct nfs_client *clp = server->nfs_client; 900 struct nfs_delegation *delegation; 901 902 rcu_read_lock(); 903 delegation = nfs4_get_valid_delegation(inode); 904 if (delegation == NULL) 905 goto out_enoent; 906 if (stateid != NULL && 907 !clp->cl_mvops->match_stateid(&delegation->stateid, stateid)) 908 goto out_enoent; 909 nfs_mark_return_delegation(server, delegation); 910 rcu_read_unlock(); 911 912 nfs_delegation_run_state_manager(clp); 913 return 0; 914 out_enoent: 915 rcu_read_unlock(); 916 return -ENOENT; 917 } 918 919 static struct inode * 920 nfs_delegation_find_inode_server(struct nfs_server *server, 921 const struct nfs_fh *fhandle) 922 { 923 struct nfs_delegation *delegation; 924 struct inode *freeme, *res = NULL; 925 926 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { 927 spin_lock(&delegation->lock); 928 if (delegation->inode != NULL && 929 !test_bit(NFS_DELEGATION_REVOKED, &delegation->flags) && 930 nfs_compare_fh(fhandle, &NFS_I(delegation->inode)->fh) == 0) { 931 freeme = igrab(delegation->inode); 932 if (freeme && nfs_sb_active(freeme->i_sb)) 933 res = freeme; 934 spin_unlock(&delegation->lock); 935 if (res != NULL) 936 return res; 937 if (freeme) { 938 rcu_read_unlock(); 939 iput(freeme); 940 rcu_read_lock(); 941 } 942 return ERR_PTR(-EAGAIN); 943 } 944 spin_unlock(&delegation->lock); 945 } 946 return ERR_PTR(-ENOENT); 947 } 948 949 /** 950 * nfs_delegation_find_inode - retrieve the inode associated with a delegation 951 * @clp: client state handle 952 * @fhandle: filehandle from a delegation recall 953 * 954 * Returns pointer to inode matching "fhandle," or NULL if a matching inode 955 * cannot be found. 956 */ 957 struct inode *nfs_delegation_find_inode(struct nfs_client *clp, 958 const struct nfs_fh *fhandle) 959 { 960 struct nfs_server *server; 961 struct inode *res; 962 963 rcu_read_lock(); 964 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { 965 res = nfs_delegation_find_inode_server(server, fhandle); 966 if (res != ERR_PTR(-ENOENT)) { 967 rcu_read_unlock(); 968 return res; 969 } 970 } 971 rcu_read_unlock(); 972 return ERR_PTR(-ENOENT); 973 } 974 975 static void nfs_delegation_mark_reclaim_server(struct nfs_server *server) 976 { 977 struct nfs_delegation *delegation; 978 979 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { 980 /* 981 * If the delegation may have been admin revoked, then we 982 * cannot reclaim it. 983 */ 984 if (test_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags)) 985 continue; 986 set_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags); 987 } 988 } 989 990 /** 991 * nfs_delegation_mark_reclaim - mark all delegations as needing to be reclaimed 992 * @clp: nfs_client to process 993 * 994 */ 995 void nfs_delegation_mark_reclaim(struct nfs_client *clp) 996 { 997 struct nfs_server *server; 998 999 rcu_read_lock(); 1000 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) 1001 nfs_delegation_mark_reclaim_server(server); 1002 rcu_read_unlock(); 1003 } 1004 1005 /** 1006 * nfs_delegation_reap_unclaimed - reap unclaimed delegations after reboot recovery is done 1007 * @clp: nfs_client to process 1008 * 1009 */ 1010 void nfs_delegation_reap_unclaimed(struct nfs_client *clp) 1011 { 1012 struct nfs_delegation *delegation; 1013 struct nfs_server *server; 1014 struct inode *inode; 1015 1016 restart: 1017 rcu_read_lock(); 1018 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { 1019 list_for_each_entry_rcu(delegation, &server->delegations, 1020 super_list) { 1021 if (test_bit(NFS_DELEGATION_INODE_FREEING, 1022 &delegation->flags) || 1023 test_bit(NFS_DELEGATION_RETURNING, 1024 &delegation->flags) || 1025 test_bit(NFS_DELEGATION_NEED_RECLAIM, 1026 &delegation->flags) == 0) 1027 continue; 1028 if (!nfs_sb_active(server->super)) 1029 break; /* continue in outer loop */ 1030 inode = nfs_delegation_grab_inode(delegation); 1031 if (inode == NULL) { 1032 rcu_read_unlock(); 1033 nfs_sb_deactive(server->super); 1034 goto restart; 1035 } 1036 delegation = nfs_start_delegation_return_locked(NFS_I(inode)); 1037 rcu_read_unlock(); 1038 if (delegation != NULL) { 1039 delegation = nfs_detach_delegation(NFS_I(inode), 1040 delegation, server); 1041 if (delegation != NULL) 1042 nfs_free_delegation(delegation); 1043 } 1044 iput(inode); 1045 nfs_sb_deactive(server->super); 1046 cond_resched(); 1047 goto restart; 1048 } 1049 } 1050 rcu_read_unlock(); 1051 } 1052 1053 static inline bool nfs4_server_rebooted(const struct nfs_client *clp) 1054 { 1055 return (clp->cl_state & (BIT(NFS4CLNT_CHECK_LEASE) | 1056 BIT(NFS4CLNT_LEASE_EXPIRED) | 1057 BIT(NFS4CLNT_SESSION_RESET))) != 0; 1058 } 1059 1060 static void nfs_mark_test_expired_delegation(struct nfs_server *server, 1061 struct nfs_delegation *delegation) 1062 { 1063 if (delegation->stateid.type == NFS4_INVALID_STATEID_TYPE) 1064 return; 1065 clear_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags); 1066 set_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags); 1067 set_bit(NFS4CLNT_DELEGATION_EXPIRED, &server->nfs_client->cl_state); 1068 } 1069 1070 static void nfs_inode_mark_test_expired_delegation(struct nfs_server *server, 1071 struct inode *inode) 1072 { 1073 struct nfs_delegation *delegation; 1074 1075 rcu_read_lock(); 1076 delegation = rcu_dereference(NFS_I(inode)->delegation); 1077 if (delegation) 1078 nfs_mark_test_expired_delegation(server, delegation); 1079 rcu_read_unlock(); 1080 1081 } 1082 1083 static void nfs_delegation_mark_test_expired_server(struct nfs_server *server) 1084 { 1085 struct nfs_delegation *delegation; 1086 1087 list_for_each_entry_rcu(delegation, &server->delegations, super_list) 1088 nfs_mark_test_expired_delegation(server, delegation); 1089 } 1090 1091 /** 1092 * nfs_mark_test_expired_all_delegations - mark all delegations for testing 1093 * @clp: nfs_client to process 1094 * 1095 * Iterates through all the delegations associated with this server and 1096 * marks them as needing to be checked for validity. 1097 */ 1098 void nfs_mark_test_expired_all_delegations(struct nfs_client *clp) 1099 { 1100 struct nfs_server *server; 1101 1102 rcu_read_lock(); 1103 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) 1104 nfs_delegation_mark_test_expired_server(server); 1105 rcu_read_unlock(); 1106 } 1107 1108 /** 1109 * nfs_test_expired_all_delegations - test all delegations for a client 1110 * @clp: nfs_client to process 1111 * 1112 * Helper for handling "recallable state revoked" status from server. 1113 */ 1114 void nfs_test_expired_all_delegations(struct nfs_client *clp) 1115 { 1116 nfs_mark_test_expired_all_delegations(clp); 1117 nfs4_schedule_state_manager(clp); 1118 } 1119 1120 static void 1121 nfs_delegation_test_free_expired(struct inode *inode, 1122 nfs4_stateid *stateid, 1123 const struct cred *cred) 1124 { 1125 struct nfs_server *server = NFS_SERVER(inode); 1126 const struct nfs4_minor_version_ops *ops = server->nfs_client->cl_mvops; 1127 int status; 1128 1129 if (!cred) 1130 return; 1131 status = ops->test_and_free_expired(server, stateid, cred); 1132 if (status == -NFS4ERR_EXPIRED || status == -NFS4ERR_BAD_STATEID) 1133 nfs_remove_bad_delegation(inode, stateid); 1134 } 1135 1136 /** 1137 * nfs_reap_expired_delegations - reap expired delegations 1138 * @clp: nfs_client to process 1139 * 1140 * Iterates through all the delegations associated with this server and 1141 * checks if they have may have been revoked. This function is usually 1142 * expected to be called in cases where the server may have lost its 1143 * lease. 1144 */ 1145 void nfs_reap_expired_delegations(struct nfs_client *clp) 1146 { 1147 struct nfs_delegation *delegation; 1148 struct nfs_server *server; 1149 struct inode *inode; 1150 const struct cred *cred; 1151 nfs4_stateid stateid; 1152 1153 restart: 1154 rcu_read_lock(); 1155 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { 1156 list_for_each_entry_rcu(delegation, &server->delegations, 1157 super_list) { 1158 if (test_bit(NFS_DELEGATION_INODE_FREEING, 1159 &delegation->flags) || 1160 test_bit(NFS_DELEGATION_RETURNING, 1161 &delegation->flags) || 1162 test_bit(NFS_DELEGATION_TEST_EXPIRED, 1163 &delegation->flags) == 0) 1164 continue; 1165 if (!nfs_sb_active(server->super)) 1166 break; /* continue in outer loop */ 1167 inode = nfs_delegation_grab_inode(delegation); 1168 if (inode == NULL) { 1169 rcu_read_unlock(); 1170 nfs_sb_deactive(server->super); 1171 goto restart; 1172 } 1173 cred = get_cred_rcu(delegation->cred); 1174 nfs4_stateid_copy(&stateid, &delegation->stateid); 1175 clear_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags); 1176 rcu_read_unlock(); 1177 nfs_delegation_test_free_expired(inode, &stateid, cred); 1178 put_cred(cred); 1179 if (nfs4_server_rebooted(clp)) { 1180 nfs_inode_mark_test_expired_delegation(server,inode); 1181 iput(inode); 1182 nfs_sb_deactive(server->super); 1183 return; 1184 } 1185 iput(inode); 1186 nfs_sb_deactive(server->super); 1187 cond_resched(); 1188 goto restart; 1189 } 1190 } 1191 rcu_read_unlock(); 1192 } 1193 1194 void nfs_inode_find_delegation_state_and_recover(struct inode *inode, 1195 const nfs4_stateid *stateid) 1196 { 1197 struct nfs_client *clp = NFS_SERVER(inode)->nfs_client; 1198 struct nfs_delegation *delegation; 1199 bool found = false; 1200 1201 rcu_read_lock(); 1202 delegation = rcu_dereference(NFS_I(inode)->delegation); 1203 if (delegation && 1204 nfs4_stateid_match_or_older(&delegation->stateid, stateid) && 1205 !test_bit(NFS_DELEGATION_REVOKED, &delegation->flags)) { 1206 nfs_mark_test_expired_delegation(NFS_SERVER(inode), delegation); 1207 found = true; 1208 } 1209 rcu_read_unlock(); 1210 if (found) 1211 nfs4_schedule_state_manager(clp); 1212 } 1213 1214 /** 1215 * nfs_delegations_present - check for existence of delegations 1216 * @clp: client state handle 1217 * 1218 * Returns one if there are any nfs_delegation structures attached 1219 * to this nfs_client. 1220 */ 1221 int nfs_delegations_present(struct nfs_client *clp) 1222 { 1223 struct nfs_server *server; 1224 int ret = 0; 1225 1226 rcu_read_lock(); 1227 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) 1228 if (!list_empty(&server->delegations)) { 1229 ret = 1; 1230 break; 1231 } 1232 rcu_read_unlock(); 1233 return ret; 1234 } 1235 1236 /** 1237 * nfs4_refresh_delegation_stateid - Update delegation stateid seqid 1238 * @dst: stateid to refresh 1239 * @inode: inode to check 1240 * 1241 * Returns "true" and updates "dst->seqid" * if inode had a delegation 1242 * that matches our delegation stateid. Otherwise "false" is returned. 1243 */ 1244 bool nfs4_refresh_delegation_stateid(nfs4_stateid *dst, struct inode *inode) 1245 { 1246 struct nfs_delegation *delegation; 1247 bool ret = false; 1248 if (!inode) 1249 goto out; 1250 1251 rcu_read_lock(); 1252 delegation = rcu_dereference(NFS_I(inode)->delegation); 1253 if (delegation != NULL && 1254 nfs4_stateid_match_other(dst, &delegation->stateid) && 1255 nfs4_stateid_is_newer(&delegation->stateid, dst) && 1256 !test_bit(NFS_DELEGATION_REVOKED, &delegation->flags)) { 1257 dst->seqid = delegation->stateid.seqid; 1258 ret = true; 1259 } 1260 rcu_read_unlock(); 1261 out: 1262 return ret; 1263 } 1264 1265 /** 1266 * nfs4_copy_delegation_stateid - Copy inode's state ID information 1267 * @inode: inode to check 1268 * @flags: delegation type requirement 1269 * @dst: stateid data structure to fill in 1270 * @cred: optional argument to retrieve credential 1271 * 1272 * Returns "true" and fills in "dst->data" * if inode had a delegation, 1273 * otherwise "false" is returned. 1274 */ 1275 bool nfs4_copy_delegation_stateid(struct inode *inode, fmode_t flags, 1276 nfs4_stateid *dst, const struct cred **cred) 1277 { 1278 struct nfs_inode *nfsi = NFS_I(inode); 1279 struct nfs_delegation *delegation; 1280 bool ret; 1281 1282 flags &= FMODE_READ|FMODE_WRITE; 1283 rcu_read_lock(); 1284 delegation = rcu_dereference(nfsi->delegation); 1285 ret = nfs4_is_valid_delegation(delegation, flags); 1286 if (ret) { 1287 nfs4_stateid_copy(dst, &delegation->stateid); 1288 nfs_mark_delegation_referenced(delegation); 1289 if (cred) 1290 *cred = get_cred(delegation->cred); 1291 } 1292 rcu_read_unlock(); 1293 return ret; 1294 } 1295 1296 /** 1297 * nfs4_delegation_flush_on_close - Check if we must flush file on close 1298 * @inode: inode to check 1299 * 1300 * This function checks the number of outstanding writes to the file 1301 * against the delegation 'space_limit' field to see if 1302 * the spec requires us to flush the file on close. 1303 */ 1304 bool nfs4_delegation_flush_on_close(const struct inode *inode) 1305 { 1306 struct nfs_inode *nfsi = NFS_I(inode); 1307 struct nfs_delegation *delegation; 1308 bool ret = true; 1309 1310 rcu_read_lock(); 1311 delegation = rcu_dereference(nfsi->delegation); 1312 if (delegation == NULL || !(delegation->type & FMODE_WRITE)) 1313 goto out; 1314 if (atomic_long_read(&nfsi->nrequests) < delegation->pagemod_limit) 1315 ret = false; 1316 out: 1317 rcu_read_unlock(); 1318 return ret; 1319 } 1320