diff options
author | Trond Myklebust <trond.myklebust@primarydata.com> | 2017-08-01 17:07:02 -0400 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@primarydata.com> | 2017-08-15 11:54:48 -0400 |
commit | 8205b9ce030288e104a3024344f2a0a086231e36 (patch) | |
tree | 1396fe9dfdae6f4c0e25bce697d2cce351c3245b | |
parent | 4b9bb25b36baa3e2e42b91e451bcd3acfe197a1d (diff) |
NFSv4/pnfs: Replace pnfs_put_lseg_locked() with pnfs_put_lseg()
Now that we no longer hold the inode->i_lock when manipulating the
commit lists, it is safe to call pnfs_put_lseg() again.
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
-rw-r--r-- | fs/nfs/pnfs.c | 41 | ||||
-rw-r--r-- | fs/nfs/pnfs.h | 2 | ||||
-rw-r--r-- | fs/nfs/pnfs_nfs.c | 4 |
3 files changed, 2 insertions, 45 deletions
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index c383d0913b54..3125a9d7b237 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c | |||
@@ -529,47 +529,6 @@ pnfs_put_lseg(struct pnfs_layout_segment *lseg) | |||
529 | } | 529 | } |
530 | EXPORT_SYMBOL_GPL(pnfs_put_lseg); | 530 | EXPORT_SYMBOL_GPL(pnfs_put_lseg); |
531 | 531 | ||
532 | static void pnfs_free_lseg_async_work(struct work_struct *work) | ||
533 | { | ||
534 | struct pnfs_layout_segment *lseg; | ||
535 | struct pnfs_layout_hdr *lo; | ||
536 | |||
537 | lseg = container_of(work, struct pnfs_layout_segment, pls_work); | ||
538 | lo = lseg->pls_layout; | ||
539 | |||
540 | pnfs_free_lseg(lseg); | ||
541 | pnfs_put_layout_hdr(lo); | ||
542 | } | ||
543 | |||
544 | static void pnfs_free_lseg_async(struct pnfs_layout_segment *lseg) | ||
545 | { | ||
546 | INIT_WORK(&lseg->pls_work, pnfs_free_lseg_async_work); | ||
547 | schedule_work(&lseg->pls_work); | ||
548 | } | ||
549 | |||
550 | void | ||
551 | pnfs_put_lseg_locked(struct pnfs_layout_segment *lseg) | ||
552 | { | ||
553 | if (!lseg) | ||
554 | return; | ||
555 | |||
556 | assert_spin_locked(&lseg->pls_layout->plh_inode->i_lock); | ||
557 | |||
558 | dprintk("%s: lseg %p ref %d valid %d\n", __func__, lseg, | ||
559 | atomic_read(&lseg->pls_refcount), | ||
560 | test_bit(NFS_LSEG_VALID, &lseg->pls_flags)); | ||
561 | if (atomic_dec_and_test(&lseg->pls_refcount)) { | ||
562 | struct pnfs_layout_hdr *lo = lseg->pls_layout; | ||
563 | if (test_bit(NFS_LSEG_VALID, &lseg->pls_flags)) | ||
564 | return; | ||
565 | pnfs_layout_remove_lseg(lo, lseg); | ||
566 | if (!pnfs_cache_lseg_for_layoutreturn(lo, lseg)) { | ||
567 | pnfs_get_layout_hdr(lo); | ||
568 | pnfs_free_lseg_async(lseg); | ||
569 | } | ||
570 | } | ||
571 | } | ||
572 | |||
573 | /* | 532 | /* |
574 | * is l2 fully contained in l1? | 533 | * is l2 fully contained in l1? |
575 | * start1 end1 | 534 | * start1 end1 |
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h index 99731e3e332f..87f144f14d1e 100644 --- a/fs/nfs/pnfs.h +++ b/fs/nfs/pnfs.h | |||
@@ -67,7 +67,6 @@ struct pnfs_layout_segment { | |||
67 | u32 pls_seq; | 67 | u32 pls_seq; |
68 | unsigned long pls_flags; | 68 | unsigned long pls_flags; |
69 | struct pnfs_layout_hdr *pls_layout; | 69 | struct pnfs_layout_hdr *pls_layout; |
70 | struct work_struct pls_work; | ||
71 | }; | 70 | }; |
72 | 71 | ||
73 | enum pnfs_try_status { | 72 | enum pnfs_try_status { |
@@ -230,7 +229,6 @@ extern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync); | |||
230 | /* pnfs.c */ | 229 | /* pnfs.c */ |
231 | void pnfs_get_layout_hdr(struct pnfs_layout_hdr *lo); | 230 | void pnfs_get_layout_hdr(struct pnfs_layout_hdr *lo); |
232 | void pnfs_put_lseg(struct pnfs_layout_segment *lseg); | 231 | void pnfs_put_lseg(struct pnfs_layout_segment *lseg); |
233 | void pnfs_put_lseg_locked(struct pnfs_layout_segment *lseg); | ||
234 | 232 | ||
235 | void set_pnfs_layoutdriver(struct nfs_server *, const struct nfs_fh *, struct nfs_fsinfo *); | 233 | void set_pnfs_layoutdriver(struct nfs_server *, const struct nfs_fh *, struct nfs_fsinfo *); |
236 | void unset_pnfs_layoutdriver(struct nfs_server *); | 234 | void unset_pnfs_layoutdriver(struct nfs_server *); |
diff --git a/fs/nfs/pnfs_nfs.c b/fs/nfs/pnfs_nfs.c index 2cdee8ce2094..4b0a809653d1 100644 --- a/fs/nfs/pnfs_nfs.c +++ b/fs/nfs/pnfs_nfs.c | |||
@@ -83,7 +83,7 @@ pnfs_generic_clear_request_commit(struct nfs_page *req, | |||
83 | } | 83 | } |
84 | out: | 84 | out: |
85 | nfs_request_remove_commit_list(req, cinfo); | 85 | nfs_request_remove_commit_list(req, cinfo); |
86 | pnfs_put_lseg_locked(freeme); | 86 | pnfs_put_lseg(freeme); |
87 | } | 87 | } |
88 | EXPORT_SYMBOL_GPL(pnfs_generic_clear_request_commit); | 88 | EXPORT_SYMBOL_GPL(pnfs_generic_clear_request_commit); |
89 | 89 | ||
@@ -126,7 +126,7 @@ pnfs_generic_scan_ds_commit_list(struct pnfs_commit_bucket *bucket, | |||
126 | if (bucket->clseg == NULL) | 126 | if (bucket->clseg == NULL) |
127 | bucket->clseg = pnfs_get_lseg(bucket->wlseg); | 127 | bucket->clseg = pnfs_get_lseg(bucket->wlseg); |
128 | if (list_empty(src)) { | 128 | if (list_empty(src)) { |
129 | pnfs_put_lseg_locked(bucket->wlseg); | 129 | pnfs_put_lseg(bucket->wlseg); |
130 | bucket->wlseg = NULL; | 130 | bucket->wlseg = NULL; |
131 | } | 131 | } |
132 | } | 132 | } |