diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-04-21 12:36:19 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-04-21 13:01:00 -0400 |
commit | 7bf97bc27308cfdc7a8dadd40ae50f7c4cb09b01 (patch) | |
tree | e2b24a12db92f9ae9c99b4a3d9d7ef462dd16429 /fs/nfs/nfs4state.c | |
parent | c77365c963cf8703ecf1004cd3b298068a3e1b76 (diff) |
NFSv4: Keep dropped state owners on the LRU list for a while
To ensure that we don't reuse their identifiers.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/nfs4state.c')
-rw-r--r-- | fs/nfs/nfs4state.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index b300fb840b21..7f0fcfc1fe9d 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c | |||
@@ -521,6 +521,14 @@ out: | |||
521 | /** | 521 | /** |
522 | * nfs4_put_state_owner - Release a nfs4_state_owner | 522 | * nfs4_put_state_owner - Release a nfs4_state_owner |
523 | * @sp: state owner data to release | 523 | * @sp: state owner data to release |
524 | * | ||
525 | * Note that we keep released state owners on an LRU | ||
526 | * list. | ||
527 | * This caches valid state owners so that they can be | ||
528 | * reused, to avoid the OPEN_CONFIRM on minor version 0. | ||
529 | * It also pins the uniquifier of dropped state owners for | ||
530 | * a while, to ensure that those state owner names are | ||
531 | * never reused. | ||
524 | */ | 532 | */ |
525 | void nfs4_put_state_owner(struct nfs4_state_owner *sp) | 533 | void nfs4_put_state_owner(struct nfs4_state_owner *sp) |
526 | { | 534 | { |
@@ -530,15 +538,9 @@ void nfs4_put_state_owner(struct nfs4_state_owner *sp) | |||
530 | if (!atomic_dec_and_lock(&sp->so_count, &clp->cl_lock)) | 538 | if (!atomic_dec_and_lock(&sp->so_count, &clp->cl_lock)) |
531 | return; | 539 | return; |
532 | 540 | ||
533 | if (!RB_EMPTY_NODE(&sp->so_server_node)) { | 541 | sp->so_expires = jiffies; |
534 | sp->so_expires = jiffies; | 542 | list_add_tail(&sp->so_lru, &server->state_owners_lru); |
535 | list_add_tail(&sp->so_lru, &server->state_owners_lru); | 543 | spin_unlock(&clp->cl_lock); |
536 | spin_unlock(&clp->cl_lock); | ||
537 | } else { | ||
538 | nfs4_remove_state_owner_locked(sp); | ||
539 | spin_unlock(&clp->cl_lock); | ||
540 | nfs4_free_state_owner(sp); | ||
541 | } | ||
542 | } | 544 | } |
543 | 545 | ||
544 | /** | 546 | /** |