diff options
author | Trond Myklebust <trond.myklebust@primarydata.com> | 2015-07-09 12:24:07 -0400 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@primarydata.com> | 2015-07-11 10:16:17 -0400 |
commit | faa4a54f0be15b5d81b574fb5a40db24345d1a6c (patch) | |
tree | 59936bd0b4c72517e745495401f7292b036a293d | |
parent | bdc59cf233433ddd2cd671db02bd6b52323ce63d (diff) |
pNFS: Don't throw out valid layout segments
It is OK for layout segments to remain hashed even if no-one holds any
references to them, provided that the segments are still valid.
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
-rw-r--r-- | fs/nfs/pnfs.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index b02e32e2abeb..18aa3b7962eb 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c | |||
@@ -422,6 +422,10 @@ pnfs_put_lseg(struct pnfs_layout_segment *lseg) | |||
422 | pnfs_layoutreturn_before_put_lseg(lseg, lo, inode); | 422 | pnfs_layoutreturn_before_put_lseg(lseg, lo, inode); |
423 | 423 | ||
424 | if (atomic_dec_and_lock(&lseg->pls_refcount, &inode->i_lock)) { | 424 | if (atomic_dec_and_lock(&lseg->pls_refcount, &inode->i_lock)) { |
425 | if (test_bit(NFS_LSEG_VALID, &lseg->pls_flags)) { | ||
426 | spin_unlock(&inode->i_lock); | ||
427 | return; | ||
428 | } | ||
425 | pnfs_get_layout_hdr(lo); | 429 | pnfs_get_layout_hdr(lo); |
426 | pnfs_layout_remove_lseg(lo, lseg); | 430 | pnfs_layout_remove_lseg(lo, lseg); |
427 | spin_unlock(&inode->i_lock); | 431 | spin_unlock(&inode->i_lock); |
@@ -462,6 +466,8 @@ pnfs_put_lseg_locked(struct pnfs_layout_segment *lseg) | |||
462 | test_bit(NFS_LSEG_VALID, &lseg->pls_flags)); | 466 | test_bit(NFS_LSEG_VALID, &lseg->pls_flags)); |
463 | if (atomic_dec_and_test(&lseg->pls_refcount)) { | 467 | if (atomic_dec_and_test(&lseg->pls_refcount)) { |
464 | struct pnfs_layout_hdr *lo = lseg->pls_layout; | 468 | struct pnfs_layout_hdr *lo = lseg->pls_layout; |
469 | if (test_bit(NFS_LSEG_VALID, &lseg->pls_flags)) | ||
470 | return; | ||
465 | pnfs_get_layout_hdr(lo); | 471 | pnfs_get_layout_hdr(lo); |
466 | pnfs_layout_remove_lseg(lo, lseg); | 472 | pnfs_layout_remove_lseg(lo, lseg); |
467 | pnfs_free_lseg_async(lseg); | 473 | pnfs_free_lseg_async(lseg); |