1 /* 2 * linux/fs/nfs/delegation.c 3 * 4 * Copyright (C) 2004 Trond Myklebust 5 * 6 * NFS file delegation management 7 * 8 */ 9 #include <linux/completion.h> 10 #include <linux/kthread.h> 11 #include <linux/module.h> 12 #include <linux/sched.h> 13 #include <linux/slab.h> 14 #include <linux/spinlock.h> 15 16 #include <linux/nfs4.h> 17 #include <linux/nfs_fs.h> 18 #include <linux/nfs_xdr.h> 19 20 #include "nfs4_fs.h" 21 #include "delegation.h" 22 #include "internal.h" 23 #include "nfs4trace.h" 24 25 static void nfs_free_delegation(struct nfs_delegation *delegation) 26 { 27 if (delegation->cred) { 28 put_rpccred(delegation->cred); 29 delegation->cred = NULL; 30 } 31 kfree_rcu(delegation, rcu); 32 } 33 34 /** 35 * nfs_mark_delegation_referenced - set delegation's REFERENCED flag 36 * @delegation: delegation to process 37 * 38 */ 39 void nfs_mark_delegation_referenced(struct nfs_delegation *delegation) 40 { 41 set_bit(NFS_DELEGATION_REFERENCED, &delegation->flags); 42 } 43 44 static bool 45 nfs4_is_valid_delegation(const struct nfs_delegation *delegation, 46 fmode_t flags) 47 { 48 if (delegation != NULL && (delegation->type & flags) == flags && 49 !test_bit(NFS_DELEGATION_REVOKED, &delegation->flags) && 50 !test_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) 51 return true; 52 return false; 53 } 54 55 static int 56 nfs4_do_check_delegation(struct inode *inode, fmode_t flags, bool mark) 57 { 58 struct nfs_delegation *delegation; 59 int ret = 0; 60 61 flags &= FMODE_READ|FMODE_WRITE; 62 rcu_read_lock(); 63 delegation = rcu_dereference(NFS_I(inode)->delegation); 64 if (nfs4_is_valid_delegation(delegation, flags)) { 65 if (mark) 66 nfs_mark_delegation_referenced(delegation); 67 ret = 1; 68 } 69 rcu_read_unlock(); 70 return ret; 71 } 72 /** 73 * nfs_have_delegation - check if inode has a delegation, mark it 74 * NFS_DELEGATION_REFERENCED if there is one. 75 * @inode: inode to check 76 * @flags: delegation types to check for 77 * 78 * Returns one if inode has the indicated delegation, otherwise zero. 79 */ 80 int nfs4_have_delegation(struct inode *inode, fmode_t flags) 81 { 82 return nfs4_do_check_delegation(inode, flags, true); 83 } 84 85 /* 86 * nfs4_check_delegation - check if inode has a delegation, do not mark 87 * NFS_DELEGATION_REFERENCED if it has one. 88 */ 89 int nfs4_check_delegation(struct inode *inode, fmode_t flags) 90 { 91 return nfs4_do_check_delegation(inode, flags, false); 92 } 93 94 static int nfs_delegation_claim_locks(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid) 95 { 96 struct inode *inode = state->inode; 97 struct file_lock *fl; 98 struct file_lock_context *flctx = inode->i_flctx; 99 struct list_head *list; 100 int status = 0; 101 102 if (flctx == NULL) 103 goto out; 104 105 list = &flctx->flc_posix; 106 spin_lock(&flctx->flc_lock); 107 restart: 108 list_for_each_entry(fl, list, fl_list) { 109 if (nfs_file_open_context(fl->fl_file) != ctx) 110 continue; 111 spin_unlock(&flctx->flc_lock); 112 status = nfs4_lock_delegation_recall(fl, state, stateid); 113 if (status < 0) 114 goto out; 115 spin_lock(&flctx->flc_lock); 116 } 117 if (list == &flctx->flc_posix) { 118 list = &flctx->flc_flock; 119 goto restart; 120 } 121 spin_unlock(&flctx->flc_lock); 122 out: 123 return status; 124 } 125 126 static int nfs_delegation_claim_opens(struct inode *inode, 127 const nfs4_stateid *stateid, fmode_t type) 128 { 129 struct nfs_inode *nfsi = NFS_I(inode); 130 struct nfs_open_context *ctx; 131 struct nfs4_state_owner *sp; 132 struct nfs4_state *state; 133 unsigned int seq; 134 int err; 135 136 again: 137 spin_lock(&inode->i_lock); 138 list_for_each_entry(ctx, &nfsi->open_files, list) { 139 state = ctx->state; 140 if (state == NULL) 141 continue; 142 if (!test_bit(NFS_DELEGATED_STATE, &state->flags)) 143 continue; 144 if (!nfs4_valid_open_stateid(state)) 145 continue; 146 if (!nfs4_stateid_match(&state->stateid, stateid)) 147 continue; 148 get_nfs_open_context(ctx); 149 spin_unlock(&inode->i_lock); 150 sp = state->owner; 151 /* Block nfs4_proc_unlck */ 152 mutex_lock(&sp->so_delegreturn_mutex); 153 seq = raw_seqcount_begin(&sp->so_reclaim_seqcount); 154 err = nfs4_open_delegation_recall(ctx, state, stateid, type); 155 if (!err) 156 err = nfs_delegation_claim_locks(ctx, state, stateid); 157 if (!err && read_seqcount_retry(&sp->so_reclaim_seqcount, seq)) 158 err = -EAGAIN; 159 mutex_unlock(&sp->so_delegreturn_mutex); 160 put_nfs_open_context(ctx); 161 if (err != 0) 162 return err; 163 goto again; 164 } 165 spin_unlock(&inode->i_lock); 166 return 0; 167 } 168 169 /** 170 * nfs_inode_reclaim_delegation - process a delegation reclaim request 171 * @inode: inode to process 172 * @cred: credential to use for request 173 * @res: new delegation state from server 174 * 175 */ 176 void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred, 177 struct nfs_openres *res) 178 { 179 struct nfs_delegation *delegation; 180 struct rpc_cred *oldcred = NULL; 181 182 rcu_read_lock(); 183 delegation = rcu_dereference(NFS_I(inode)->delegation); 184 if (delegation != NULL) { 185 spin_lock(&delegation->lock); 186 if (delegation->inode != NULL) { 187 nfs4_stateid_copy(&delegation->stateid, &res->delegation); 188 delegation->type = res->delegation_type; 189 delegation->pagemod_limit = res->pagemod_limit; 190 oldcred = delegation->cred; 191 delegation->cred = get_rpccred(cred); 192 clear_bit(NFS_DELEGATION_NEED_RECLAIM, 193 &delegation->flags); 194 spin_unlock(&delegation->lock); 195 rcu_read_unlock(); 196 put_rpccred(oldcred); 197 trace_nfs4_reclaim_delegation(inode, res->delegation_type); 198 } else { 199 /* We appear to have raced with a delegation return. */ 200 spin_unlock(&delegation->lock); 201 rcu_read_unlock(); 202 nfs_inode_set_delegation(inode, cred, res); 203 } 204 } else { 205 rcu_read_unlock(); 206 } 207 } 208 209 static int nfs_do_return_delegation(struct inode *inode, struct nfs_delegation *delegation, int issync) 210 { 211 int res = 0; 212 213 if (!test_bit(NFS_DELEGATION_REVOKED, &delegation->flags)) 214 res = nfs4_proc_delegreturn(inode, 215 delegation->cred, 216 &delegation->stateid, 217 issync); 218 nfs_free_delegation(delegation); 219 return res; 220 } 221 222 static struct inode *nfs_delegation_grab_inode(struct nfs_delegation *delegation) 223 { 224 struct inode *inode = NULL; 225 226 spin_lock(&delegation->lock); 227 if (delegation->inode != NULL) 228 inode = igrab(delegation->inode); 229 spin_unlock(&delegation->lock); 230 return inode; 231 } 232 233 static struct nfs_delegation * 234 nfs_start_delegation_return_locked(struct nfs_inode *nfsi) 235 { 236 struct nfs_delegation *ret = NULL; 237 struct nfs_delegation *delegation = rcu_dereference(nfsi->delegation); 238 239 if (delegation == NULL) 240 goto out; 241 spin_lock(&delegation->lock); 242 if (!test_and_set_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) 243 ret = delegation; 244 spin_unlock(&delegation->lock); 245 out: 246 return ret; 247 } 248 249 static struct nfs_delegation * 250 nfs_start_delegation_return(struct nfs_inode *nfsi) 251 { 252 struct nfs_delegation *delegation; 253 254 rcu_read_lock(); 255 delegation = nfs_start_delegation_return_locked(nfsi); 256 rcu_read_unlock(); 257 return delegation; 258 } 259 260 static void 261 nfs_abort_delegation_return(struct nfs_delegation *delegation, 262 struct nfs_client *clp) 263 { 264 265 spin_lock(&delegation->lock); 266 clear_bit(NFS_DELEGATION_RETURNING, &delegation->flags); 267 set_bit(NFS_DELEGATION_RETURN, &delegation->flags); 268 spin_unlock(&delegation->lock); 269 set_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state); 270 } 271 272 static struct nfs_delegation * 273 nfs_detach_delegation_locked(struct nfs_inode *nfsi, 274 struct nfs_delegation *delegation, 275 struct nfs_client *clp) 276 { 277 struct nfs_delegation *deleg_cur = 278 rcu_dereference_protected(nfsi->delegation, 279 lockdep_is_held(&clp->cl_lock)); 280 281 if (deleg_cur == NULL || delegation != deleg_cur) 282 return NULL; 283 284 spin_lock(&delegation->lock); 285 set_bit(NFS_DELEGATION_RETURNING, &delegation->flags); 286 list_del_rcu(&delegation->super_list); 287 delegation->inode = NULL; 288 rcu_assign_pointer(nfsi->delegation, NULL); 289 spin_unlock(&delegation->lock); 290 return delegation; 291 } 292 293 static struct nfs_delegation *nfs_detach_delegation(struct nfs_inode *nfsi, 294 struct nfs_delegation *delegation, 295 struct nfs_server *server) 296 { 297 struct nfs_client *clp = server->nfs_client; 298 299 spin_lock(&clp->cl_lock); 300 delegation = nfs_detach_delegation_locked(nfsi, delegation, clp); 301 spin_unlock(&clp->cl_lock); 302 return delegation; 303 } 304 305 static struct nfs_delegation * 306 nfs_inode_detach_delegation(struct inode *inode) 307 { 308 struct nfs_inode *nfsi = NFS_I(inode); 309 struct nfs_server *server = NFS_SERVER(inode); 310 struct nfs_delegation *delegation; 311 312 delegation = nfs_start_delegation_return(nfsi); 313 if (delegation == NULL) 314 return NULL; 315 return nfs_detach_delegation(nfsi, delegation, server); 316 } 317 318 static void 319 nfs_update_inplace_delegation(struct nfs_delegation *delegation, 320 const struct nfs_delegation *update) 321 { 322 if (nfs4_stateid_is_newer(&update->stateid, &delegation->stateid)) { 323 delegation->stateid.seqid = update->stateid.seqid; 324 smp_wmb(); 325 delegation->type = update->type; 326 } 327 } 328 329 /** 330 * nfs_inode_set_delegation - set up a delegation on an inode 331 * @inode: inode to which delegation applies 332 * @cred: cred to use for subsequent delegation processing 333 * @res: new delegation state from server 334 * 335 * Returns zero on success, or a negative errno value. 336 */ 337 int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct nfs_openres *res) 338 { 339 struct nfs_server *server = NFS_SERVER(inode); 340 struct nfs_client *clp = server->nfs_client; 341 struct nfs_inode *nfsi = NFS_I(inode); 342 struct nfs_delegation *delegation, *old_delegation; 343 struct nfs_delegation *freeme = NULL; 344 int status = 0; 345 346 delegation = kmalloc(sizeof(*delegation), GFP_NOFS); 347 if (delegation == NULL) 348 return -ENOMEM; 349 nfs4_stateid_copy(&delegation->stateid, &res->delegation); 350 delegation->type = res->delegation_type; 351 delegation->pagemod_limit = res->pagemod_limit; 352 delegation->change_attr = inode->i_version; 353 delegation->cred = get_rpccred(cred); 354 delegation->inode = inode; 355 delegation->flags = 1<<NFS_DELEGATION_REFERENCED; 356 spin_lock_init(&delegation->lock); 357 358 spin_lock(&clp->cl_lock); 359 old_delegation = rcu_dereference_protected(nfsi->delegation, 360 lockdep_is_held(&clp->cl_lock)); 361 if (old_delegation != NULL) { 362 /* Is this an update of the existing delegation? */ 363 if (nfs4_stateid_match_other(&old_delegation->stateid, 364 &delegation->stateid)) { 365 nfs_update_inplace_delegation(old_delegation, 366 delegation); 367 goto out; 368 } 369 /* 370 * Deal with broken servers that hand out two 371 * delegations for the same file. 372 * Allow for upgrades to a WRITE delegation, but 373 * nothing else. 374 */ 375 dfprintk(FILE, "%s: server %s handed out " 376 "a duplicate delegation!\n", 377 __func__, clp->cl_hostname); 378 if (delegation->type == old_delegation->type || 379 !(delegation->type & FMODE_WRITE)) { 380 freeme = delegation; 381 delegation = NULL; 382 goto out; 383 } 384 if (test_and_set_bit(NFS_DELEGATION_RETURNING, 385 &old_delegation->flags)) 386 goto out; 387 freeme = nfs_detach_delegation_locked(nfsi, 388 old_delegation, clp); 389 if (freeme == NULL) 390 goto out; 391 } 392 list_add_tail_rcu(&delegation->super_list, &server->delegations); 393 rcu_assign_pointer(nfsi->delegation, delegation); 394 delegation = NULL; 395 396 /* Ensure we revalidate the attributes and page cache! */ 397 spin_lock(&inode->i_lock); 398 nfsi->cache_validity |= NFS_INO_REVAL_FORCED; 399 spin_unlock(&inode->i_lock); 400 trace_nfs4_set_delegation(inode, res->delegation_type); 401 402 out: 403 spin_unlock(&clp->cl_lock); 404 if (delegation != NULL) 405 nfs_free_delegation(delegation); 406 if (freeme != NULL) 407 nfs_do_return_delegation(inode, freeme, 0); 408 return status; 409 } 410 411 /* 412 * Basic procedure for returning a delegation to the server 413 */ 414 static int nfs_end_delegation_return(struct inode *inode, struct nfs_delegation *delegation, int issync) 415 { 416 struct nfs_client *clp = NFS_SERVER(inode)->nfs_client; 417 struct nfs_inode *nfsi = NFS_I(inode); 418 int err = 0; 419 420 if (delegation == NULL) 421 return 0; 422 do { 423 if (test_bit(NFS_DELEGATION_REVOKED, &delegation->flags)) 424 break; 425 err = nfs_delegation_claim_opens(inode, &delegation->stateid, 426 delegation->type); 427 if (!issync || err != -EAGAIN) 428 break; 429 /* 430 * Guard against state recovery 431 */ 432 err = nfs4_wait_clnt_recover(clp); 433 } while (err == 0); 434 435 if (err) { 436 nfs_abort_delegation_return(delegation, clp); 437 goto out; 438 } 439 if (!nfs_detach_delegation(nfsi, delegation, NFS_SERVER(inode))) 440 goto out; 441 442 err = nfs_do_return_delegation(inode, delegation, issync); 443 out: 444 return err; 445 } 446 447 static bool nfs_delegation_need_return(struct nfs_delegation *delegation) 448 { 449 bool ret = false; 450 451 if (test_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) 452 goto out; 453 if (test_and_clear_bit(NFS_DELEGATION_RETURN, &delegation->flags)) 454 ret = true; 455 if (test_and_clear_bit(NFS_DELEGATION_RETURN_IF_CLOSED, &delegation->flags) && !ret) { 456 struct inode *inode; 457 458 spin_lock(&delegation->lock); 459 inode = delegation->inode; 460 if (inode && list_empty(&NFS_I(inode)->open_files)) 461 ret = true; 462 spin_unlock(&delegation->lock); 463 } 464 out: 465 return ret; 466 } 467 468 /** 469 * nfs_client_return_marked_delegations - return previously marked delegations 470 * @clp: nfs_client to process 471 * 472 * Note that this function is designed to be called by the state 473 * manager thread. For this reason, it cannot flush the dirty data, 474 * since that could deadlock in case of a state recovery error. 475 * 476 * Returns zero on success, or a negative errno value. 477 */ 478 int nfs_client_return_marked_delegations(struct nfs_client *clp) 479 { 480 struct nfs_delegation *delegation; 481 struct nfs_server *server; 482 struct inode *inode; 483 int err = 0; 484 485 restart: 486 rcu_read_lock(); 487 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { 488 list_for_each_entry_rcu(delegation, &server->delegations, 489 super_list) { 490 if (!nfs_delegation_need_return(delegation)) 491 continue; 492 if (!nfs_sb_active(server->super)) 493 continue; 494 inode = nfs_delegation_grab_inode(delegation); 495 if (inode == NULL) { 496 rcu_read_unlock(); 497 nfs_sb_deactive(server->super); 498 goto restart; 499 } 500 delegation = nfs_start_delegation_return_locked(NFS_I(inode)); 501 rcu_read_unlock(); 502 503 err = nfs_end_delegation_return(inode, delegation, 0); 504 iput(inode); 505 nfs_sb_deactive(server->super); 506 if (!err) 507 goto restart; 508 set_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state); 509 return err; 510 } 511 } 512 rcu_read_unlock(); 513 return 0; 514 } 515 516 /** 517 * nfs_inode_return_delegation_noreclaim - return delegation, don't reclaim opens 518 * @inode: inode to process 519 * 520 * Does not protect against delegation reclaims, therefore really only safe 521 * to be called from nfs4_clear_inode(). 522 */ 523 void nfs_inode_return_delegation_noreclaim(struct inode *inode) 524 { 525 struct nfs_delegation *delegation; 526 527 delegation = nfs_inode_detach_delegation(inode); 528 if (delegation != NULL) 529 nfs_do_return_delegation(inode, delegation, 1); 530 } 531 532 /** 533 * nfs_inode_return_delegation - synchronously return a delegation 534 * @inode: inode to process 535 * 536 * This routine will always flush any dirty data to disk on the 537 * assumption that if we need to return the delegation, then 538 * we should stop caching. 539 * 540 * Returns zero on success, or a negative errno value. 541 */ 542 int nfs4_inode_return_delegation(struct inode *inode) 543 { 544 struct nfs_inode *nfsi = NFS_I(inode); 545 struct nfs_delegation *delegation; 546 int err = 0; 547 548 nfs_wb_all(inode); 549 delegation = nfs_start_delegation_return(nfsi); 550 if (delegation != NULL) 551 err = nfs_end_delegation_return(inode, delegation, 1); 552 return err; 553 } 554 555 static void nfs_mark_return_if_closed_delegation(struct nfs_server *server, 556 struct nfs_delegation *delegation) 557 { 558 set_bit(NFS_DELEGATION_RETURN_IF_CLOSED, &delegation->flags); 559 set_bit(NFS4CLNT_DELEGRETURN, &server->nfs_client->cl_state); 560 } 561 562 static void nfs_mark_return_delegation(struct nfs_server *server, 563 struct nfs_delegation *delegation) 564 { 565 set_bit(NFS_DELEGATION_RETURN, &delegation->flags); 566 set_bit(NFS4CLNT_DELEGRETURN, &server->nfs_client->cl_state); 567 } 568 569 static bool nfs_server_mark_return_all_delegations(struct nfs_server *server) 570 { 571 struct nfs_delegation *delegation; 572 bool ret = false; 573 574 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { 575 nfs_mark_return_delegation(server, delegation); 576 ret = true; 577 } 578 return ret; 579 } 580 581 static void nfs_client_mark_return_all_delegations(struct nfs_client *clp) 582 { 583 struct nfs_server *server; 584 585 rcu_read_lock(); 586 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) 587 nfs_server_mark_return_all_delegations(server); 588 rcu_read_unlock(); 589 } 590 591 static void nfs_delegation_run_state_manager(struct nfs_client *clp) 592 { 593 if (test_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state)) 594 nfs4_schedule_state_manager(clp); 595 } 596 597 /** 598 * nfs_expire_all_delegations 599 * @clp: client to process 600 * 601 */ 602 void nfs_expire_all_delegations(struct nfs_client *clp) 603 { 604 nfs_client_mark_return_all_delegations(clp); 605 nfs_delegation_run_state_manager(clp); 606 } 607 608 /** 609 * nfs_super_return_all_delegations - return delegations for one superblock 610 * @sb: sb to process 611 * 612 */ 613 void nfs_server_return_all_delegations(struct nfs_server *server) 614 { 615 struct nfs_client *clp = server->nfs_client; 616 bool need_wait; 617 618 if (clp == NULL) 619 return; 620 621 rcu_read_lock(); 622 need_wait = nfs_server_mark_return_all_delegations(server); 623 rcu_read_unlock(); 624 625 if (need_wait) { 626 nfs4_schedule_state_manager(clp); 627 nfs4_wait_clnt_recover(clp); 628 } 629 } 630 631 static void nfs_mark_return_unused_delegation_types(struct nfs_server *server, 632 fmode_t flags) 633 { 634 struct nfs_delegation *delegation; 635 636 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { 637 if ((delegation->type == (FMODE_READ|FMODE_WRITE)) && !(flags & FMODE_WRITE)) 638 continue; 639 if (delegation->type & flags) 640 nfs_mark_return_if_closed_delegation(server, delegation); 641 } 642 } 643 644 static void nfs_client_mark_return_unused_delegation_types(struct nfs_client *clp, 645 fmode_t flags) 646 { 647 struct nfs_server *server; 648 649 rcu_read_lock(); 650 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) 651 nfs_mark_return_unused_delegation_types(server, flags); 652 rcu_read_unlock(); 653 } 654 655 static void nfs_revoke_delegation(struct inode *inode) 656 { 657 struct nfs_delegation *delegation; 658 rcu_read_lock(); 659 delegation = rcu_dereference(NFS_I(inode)->delegation); 660 if (delegation != NULL) { 661 set_bit(NFS_DELEGATION_REVOKED, &delegation->flags); 662 nfs_mark_return_delegation(NFS_SERVER(inode), delegation); 663 } 664 rcu_read_unlock(); 665 } 666 667 void nfs_remove_bad_delegation(struct inode *inode) 668 { 669 struct nfs_delegation *delegation; 670 671 nfs_revoke_delegation(inode); 672 delegation = nfs_inode_detach_delegation(inode); 673 if (delegation) { 674 nfs_inode_find_state_and_recover(inode, &delegation->stateid); 675 nfs_free_delegation(delegation); 676 } 677 } 678 EXPORT_SYMBOL_GPL(nfs_remove_bad_delegation); 679 680 /** 681 * nfs_expire_unused_delegation_types 682 * @clp: client to process 683 * @flags: delegation types to expire 684 * 685 */ 686 void nfs_expire_unused_delegation_types(struct nfs_client *clp, fmode_t flags) 687 { 688 nfs_client_mark_return_unused_delegation_types(clp, flags); 689 nfs_delegation_run_state_manager(clp); 690 } 691 692 static void nfs_mark_return_unreferenced_delegations(struct nfs_server *server) 693 { 694 struct nfs_delegation *delegation; 695 696 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { 697 if (test_and_clear_bit(NFS_DELEGATION_REFERENCED, &delegation->flags)) 698 continue; 699 nfs_mark_return_if_closed_delegation(server, delegation); 700 } 701 } 702 703 /** 704 * nfs_expire_unreferenced_delegations - Eliminate unused delegations 705 * @clp: nfs_client to process 706 * 707 */ 708 void nfs_expire_unreferenced_delegations(struct nfs_client *clp) 709 { 710 struct nfs_server *server; 711 712 rcu_read_lock(); 713 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) 714 nfs_mark_return_unreferenced_delegations(server); 715 rcu_read_unlock(); 716 717 nfs_delegation_run_state_manager(clp); 718 } 719 720 /** 721 * nfs_async_inode_return_delegation - asynchronously return a delegation 722 * @inode: inode to process 723 * @stateid: state ID information 724 * 725 * Returns zero on success, or a negative errno value. 726 */ 727 int nfs_async_inode_return_delegation(struct inode *inode, 728 const nfs4_stateid *stateid) 729 { 730 struct nfs_server *server = NFS_SERVER(inode); 731 struct nfs_client *clp = server->nfs_client; 732 struct nfs_delegation *delegation; 733 734 rcu_read_lock(); 735 delegation = rcu_dereference(NFS_I(inode)->delegation); 736 if (delegation == NULL) 737 goto out_enoent; 738 if (stateid != NULL && 739 !clp->cl_mvops->match_stateid(&delegation->stateid, stateid)) 740 goto out_enoent; 741 nfs_mark_return_delegation(server, delegation); 742 rcu_read_unlock(); 743 744 nfs_delegation_run_state_manager(clp); 745 return 0; 746 out_enoent: 747 rcu_read_unlock(); 748 return -ENOENT; 749 } 750 751 static struct inode * 752 nfs_delegation_find_inode_server(struct nfs_server *server, 753 const struct nfs_fh *fhandle) 754 { 755 struct nfs_delegation *delegation; 756 struct inode *res = NULL; 757 758 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { 759 spin_lock(&delegation->lock); 760 if (delegation->inode != NULL && 761 nfs_compare_fh(fhandle, &NFS_I(delegation->inode)->fh) == 0) { 762 res = igrab(delegation->inode); 763 } 764 spin_unlock(&delegation->lock); 765 if (res != NULL) 766 break; 767 } 768 return res; 769 } 770 771 /** 772 * nfs_delegation_find_inode - retrieve the inode associated with a delegation 773 * @clp: client state handle 774 * @fhandle: filehandle from a delegation recall 775 * 776 * Returns pointer to inode matching "fhandle," or NULL if a matching inode 777 * cannot be found. 778 */ 779 struct inode *nfs_delegation_find_inode(struct nfs_client *clp, 780 const struct nfs_fh *fhandle) 781 { 782 struct nfs_server *server; 783 struct inode *res = NULL; 784 785 rcu_read_lock(); 786 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { 787 res = nfs_delegation_find_inode_server(server, fhandle); 788 if (res != NULL) 789 break; 790 } 791 rcu_read_unlock(); 792 return res; 793 } 794 795 static void nfs_delegation_mark_reclaim_server(struct nfs_server *server) 796 { 797 struct nfs_delegation *delegation; 798 799 list_for_each_entry_rcu(delegation, &server->delegations, super_list) 800 set_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags); 801 } 802 803 /** 804 * nfs_delegation_mark_reclaim - mark all delegations as needing to be reclaimed 805 * @clp: nfs_client to process 806 * 807 */ 808 void nfs_delegation_mark_reclaim(struct nfs_client *clp) 809 { 810 struct nfs_server *server; 811 812 rcu_read_lock(); 813 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) 814 nfs_delegation_mark_reclaim_server(server); 815 rcu_read_unlock(); 816 } 817 818 /** 819 * nfs_delegation_reap_unclaimed - reap unclaimed delegations after reboot recovery is done 820 * @clp: nfs_client to process 821 * 822 */ 823 void nfs_delegation_reap_unclaimed(struct nfs_client *clp) 824 { 825 struct nfs_delegation *delegation; 826 struct nfs_server *server; 827 struct inode *inode; 828 829 restart: 830 rcu_read_lock(); 831 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { 832 list_for_each_entry_rcu(delegation, &server->delegations, 833 super_list) { 834 if (test_bit(NFS_DELEGATION_RETURNING, 835 &delegation->flags)) 836 continue; 837 if (test_bit(NFS_DELEGATION_NEED_RECLAIM, 838 &delegation->flags) == 0) 839 continue; 840 if (!nfs_sb_active(server->super)) 841 continue; 842 inode = nfs_delegation_grab_inode(delegation); 843 if (inode == NULL) { 844 rcu_read_unlock(); 845 nfs_sb_deactive(server->super); 846 goto restart; 847 } 848 delegation = nfs_start_delegation_return_locked(NFS_I(inode)); 849 rcu_read_unlock(); 850 if (delegation != NULL) { 851 delegation = nfs_detach_delegation(NFS_I(inode), 852 delegation, server); 853 if (delegation != NULL) 854 nfs_free_delegation(delegation); 855 } 856 iput(inode); 857 nfs_sb_deactive(server->super); 858 goto restart; 859 } 860 } 861 rcu_read_unlock(); 862 } 863 864 /** 865 * nfs_delegations_present - check for existence of delegations 866 * @clp: client state handle 867 * 868 * Returns one if there are any nfs_delegation structures attached 869 * to this nfs_client. 870 */ 871 int nfs_delegations_present(struct nfs_client *clp) 872 { 873 struct nfs_server *server; 874 int ret = 0; 875 876 rcu_read_lock(); 877 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) 878 if (!list_empty(&server->delegations)) { 879 ret = 1; 880 break; 881 } 882 rcu_read_unlock(); 883 return ret; 884 } 885 886 /** 887 * nfs4_copy_delegation_stateid - Copy inode's state ID information 888 * @inode: inode to check 889 * @flags: delegation type requirement 890 * @dst: stateid data structure to fill in 891 * @cred: optional argument to retrieve credential 892 * 893 * Returns "true" and fills in "dst->data" * if inode had a delegation, 894 * otherwise "false" is returned. 895 */ 896 bool nfs4_copy_delegation_stateid(struct inode *inode, fmode_t flags, 897 nfs4_stateid *dst, struct rpc_cred **cred) 898 { 899 struct nfs_inode *nfsi = NFS_I(inode); 900 struct nfs_delegation *delegation; 901 bool ret; 902 903 flags &= FMODE_READ|FMODE_WRITE; 904 rcu_read_lock(); 905 delegation = rcu_dereference(nfsi->delegation); 906 ret = nfs4_is_valid_delegation(delegation, flags); 907 if (ret) { 908 nfs4_stateid_copy(dst, &delegation->stateid); 909 nfs_mark_delegation_referenced(delegation); 910 if (cred) 911 *cred = get_rpccred(delegation->cred); 912 } 913 rcu_read_unlock(); 914 return ret; 915 } 916 917 /** 918 * nfs4_delegation_flush_on_close - Check if we must flush file on close 919 * @inode: inode to check 920 * 921 * This function checks the number of outstanding writes to the file 922 * against the delegation 'space_limit' field to see if 923 * the spec requires us to flush the file on close. 924 */ 925 bool nfs4_delegation_flush_on_close(const struct inode *inode) 926 { 927 struct nfs_inode *nfsi = NFS_I(inode); 928 struct nfs_delegation *delegation; 929 bool ret = true; 930 931 rcu_read_lock(); 932 delegation = rcu_dereference(nfsi->delegation); 933 if (delegation == NULL || !(delegation->type & FMODE_WRITE)) 934 goto out; 935 if (nfsi->nrequests < delegation->pagemod_limit) 936 ret = false; 937 out: 938 rcu_read_unlock(); 939 return ret; 940 } 941
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.