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 /fs/nfs | |
| 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>
Diffstat (limited to 'fs/nfs')
| -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)  }  EXPORT_SYMBOL_GPL(pnfs_put_lseg); -static void pnfs_free_lseg_async_work(struct work_struct *work) -{ -	struct pnfs_layout_segment *lseg; -	struct pnfs_layout_hdr *lo; - -	lseg = container_of(work, struct pnfs_layout_segment, pls_work); -	lo = lseg->pls_layout; - -	pnfs_free_lseg(lseg); -	pnfs_put_layout_hdr(lo); -} - -static void pnfs_free_lseg_async(struct pnfs_layout_segment *lseg) -{ -	INIT_WORK(&lseg->pls_work, pnfs_free_lseg_async_work); -	schedule_work(&lseg->pls_work); -} - -void -pnfs_put_lseg_locked(struct pnfs_layout_segment *lseg) -{ -	if (!lseg) -		return; - -	assert_spin_locked(&lseg->pls_layout->plh_inode->i_lock); - -	dprintk("%s: lseg %p ref %d valid %d\n", __func__, lseg, -		atomic_read(&lseg->pls_refcount), -		test_bit(NFS_LSEG_VALID, &lseg->pls_flags)); -	if (atomic_dec_and_test(&lseg->pls_refcount)) { -		struct pnfs_layout_hdr *lo = lseg->pls_layout; -		if (test_bit(NFS_LSEG_VALID, &lseg->pls_flags)) -			return; -		pnfs_layout_remove_lseg(lo, lseg); -		if (!pnfs_cache_lseg_for_layoutreturn(lo, lseg)) { -			pnfs_get_layout_hdr(lo); -			pnfs_free_lseg_async(lseg); -		} -	} -} -  /*   * is l2 fully contained in l1?   *   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 {  	u32 pls_seq;  	unsigned long pls_flags;  	struct pnfs_layout_hdr *pls_layout; -	struct work_struct pls_work;  };  enum pnfs_try_status { @@ -230,7 +229,6 @@ extern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync);  /* pnfs.c */  void pnfs_get_layout_hdr(struct pnfs_layout_hdr *lo);  void pnfs_put_lseg(struct pnfs_layout_segment *lseg); -void pnfs_put_lseg_locked(struct pnfs_layout_segment *lseg);  void set_pnfs_layoutdriver(struct nfs_server *, const struct nfs_fh *, struct nfs_fsinfo *);  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,  	}  out:  	nfs_request_remove_commit_list(req, cinfo); -	pnfs_put_lseg_locked(freeme); +	pnfs_put_lseg(freeme);  }  EXPORT_SYMBOL_GPL(pnfs_generic_clear_request_commit); @@ -126,7 +126,7 @@ pnfs_generic_scan_ds_commit_list(struct pnfs_commit_bucket *bucket,  		if (bucket->clseg == NULL)  			bucket->clseg = pnfs_get_lseg(bucket->wlseg);  		if (list_empty(src)) { -			pnfs_put_lseg_locked(bucket->wlseg); +			pnfs_put_lseg(bucket->wlseg);  			bucket->wlseg = NULL;  		}  	} | 
