aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@primarydata.com>2017-08-01 17:07:02 -0400
committerTrond Myklebust <trond.myklebust@primarydata.com>2017-08-15 11:54:48 -0400
commit8205b9ce030288e104a3024344f2a0a086231e36 (patch)
tree1396fe9dfdae6f4c0e25bce697d2cce351c3245b
parent4b9bb25b36baa3e2e42b91e451bcd3acfe197a1d (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.c41
-rw-r--r--fs/nfs/pnfs.h2
-rw-r--r--fs/nfs/pnfs_nfs.c4
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}
530EXPORT_SYMBOL_GPL(pnfs_put_lseg); 530EXPORT_SYMBOL_GPL(pnfs_put_lseg);
531 531
532static 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
544static 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
550void
551pnfs_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
73enum pnfs_try_status { 72enum pnfs_try_status {
@@ -230,7 +229,6 @@ extern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync);
230/* pnfs.c */ 229/* pnfs.c */
231void pnfs_get_layout_hdr(struct pnfs_layout_hdr *lo); 230void pnfs_get_layout_hdr(struct pnfs_layout_hdr *lo);
232void pnfs_put_lseg(struct pnfs_layout_segment *lseg); 231void pnfs_put_lseg(struct pnfs_layout_segment *lseg);
233void pnfs_put_lseg_locked(struct pnfs_layout_segment *lseg);
234 232
235void set_pnfs_layoutdriver(struct nfs_server *, const struct nfs_fh *, struct nfs_fsinfo *); 233void set_pnfs_layoutdriver(struct nfs_server *, const struct nfs_fh *, struct nfs_fsinfo *);
236void unset_pnfs_layoutdriver(struct nfs_server *); 234void 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 }
84out: 84out:
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}
88EXPORT_SYMBOL_GPL(pnfs_generic_clear_request_commit); 88EXPORT_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 }