mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	pnfs: Refactor the *_layout_mark_request_commit to use pnfs_layout_mark_request_commit
The File Layout's filelayout_mark_request_commit() is almost the Flex File Layout's ff_layout_mark_request_commit(). And that can be reduced by calling into nfs_request_add_commit_list(). Signed-off-by: Tom Haynes <loghyr@primarydata.com> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
		
							parent
							
								
									487b9b8afd
								
							
						
					
					
						commit
						338d00cfef
					
				
					 4 changed files with 45 additions and 75 deletions
				
			
		| 
						 | 
				
			
			@ -960,48 +960,20 @@ filelayout_mark_request_commit(struct nfs_page *req,
 | 
			
		|||
{
 | 
			
		||||
	struct nfs4_filelayout_segment *fl = FILELAYOUT_LSEG(lseg);
 | 
			
		||||
	u32 i, j;
 | 
			
		||||
	struct list_head *list;
 | 
			
		||||
	struct pnfs_commit_bucket *buckets;
 | 
			
		||||
 | 
			
		||||
	if (fl->commit_through_mds) {
 | 
			
		||||
		list = &cinfo->mds->list;
 | 
			
		||||
		spin_lock(cinfo->lock);
 | 
			
		||||
		goto mds_commit;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Note that we are calling nfs4_fl_calc_j_index on each page
 | 
			
		||||
	 * that ends up being committed to a data server.  An attractive
 | 
			
		||||
	 * alternative is to add a field to nfs_write_data and nfs_page
 | 
			
		||||
	 * to store the value calculated in filelayout_write_pagelist
 | 
			
		||||
	 * and just use that here.
 | 
			
		||||
	 */
 | 
			
		||||
	j = nfs4_fl_calc_j_index(lseg, req_offset(req));
 | 
			
		||||
	i = select_bucket_index(fl, j);
 | 
			
		||||
	spin_lock(cinfo->lock);
 | 
			
		||||
	buckets = cinfo->ds->buckets;
 | 
			
		||||
	list = &buckets[i].written;
 | 
			
		||||
	if (list_empty(list)) {
 | 
			
		||||
		/* Non-empty buckets hold a reference on the lseg.  That ref
 | 
			
		||||
		 * is normally transferred to the COMMIT call and released
 | 
			
		||||
		 * there.  It could also be released if the last req is pulled
 | 
			
		||||
		 * off due to a rewrite, in which case it will be done in
 | 
			
		||||
		 * pnfs_generic_clear_request_commit
 | 
			
		||||
		nfs_request_add_commit_list(req, &cinfo->mds->list, cinfo);
 | 
			
		||||
	} else {
 | 
			
		||||
		/* Note that we are calling nfs4_fl_calc_j_index on each page
 | 
			
		||||
		 * that ends up being committed to a data server.  An attractive
 | 
			
		||||
		 * alternative is to add a field to nfs_write_data and nfs_page
 | 
			
		||||
		 * to store the value calculated in filelayout_write_pagelist
 | 
			
		||||
		 * and just use that here.
 | 
			
		||||
		 */
 | 
			
		||||
		buckets[i].wlseg = pnfs_get_lseg(lseg);
 | 
			
		||||
		j = nfs4_fl_calc_j_index(lseg, req_offset(req));
 | 
			
		||||
		i = select_bucket_index(fl, j);
 | 
			
		||||
		pnfs_layout_mark_request_commit(req, lseg, cinfo, i);
 | 
			
		||||
	}
 | 
			
		||||
	set_bit(PG_COMMIT_TO_DS, &req->wb_flags);
 | 
			
		||||
	cinfo->ds->nwritten++;
 | 
			
		||||
 | 
			
		||||
mds_commit:
 | 
			
		||||
	/* nfs_request_add_commit_list(). We need to add req to list without
 | 
			
		||||
	 * dropping cinfo lock.
 | 
			
		||||
	 */
 | 
			
		||||
	set_bit(PG_CLEAN, &(req)->wb_flags);
 | 
			
		||||
	nfs_list_add_request(req, list);
 | 
			
		||||
	cinfo->mds->ncommit++;
 | 
			
		||||
	spin_unlock(cinfo->lock);
 | 
			
		||||
	if (!cinfo->dreq)
 | 
			
		||||
		nfs_mark_page_unstable(req->wb_page);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static u32 calc_ds_index_from_commit(struct pnfs_layout_segment *lseg, u32 i)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1332,42 +1332,6 @@ ff_layout_write_pagelist(struct nfs_pgio_header *hdr, int sync)
 | 
			
		|||
	return PNFS_ATTEMPTED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ff_layout_mark_request_commit(struct nfs_page *req,
 | 
			
		||||
			      struct pnfs_layout_segment *lseg,
 | 
			
		||||
			      struct nfs_commit_info *cinfo,
 | 
			
		||||
			      u32 ds_commit_idx)
 | 
			
		||||
{
 | 
			
		||||
	struct list_head *list;
 | 
			
		||||
	struct pnfs_commit_bucket *buckets;
 | 
			
		||||
 | 
			
		||||
	spin_lock(cinfo->lock);
 | 
			
		||||
	buckets = cinfo->ds->buckets;
 | 
			
		||||
	list = &buckets[ds_commit_idx].written;
 | 
			
		||||
	if (list_empty(list)) {
 | 
			
		||||
		/* Non-empty buckets hold a reference on the lseg.  That ref
 | 
			
		||||
		 * is normally transferred to the COMMIT call and released
 | 
			
		||||
		 * there.  It could also be released if the last req is pulled
 | 
			
		||||
		 * off due to a rewrite, in which case it will be done in
 | 
			
		||||
		 * pnfs_common_clear_request_commit
 | 
			
		||||
		 */
 | 
			
		||||
		WARN_ON_ONCE(buckets[ds_commit_idx].wlseg != NULL);
 | 
			
		||||
		buckets[ds_commit_idx].wlseg = pnfs_get_lseg(lseg);
 | 
			
		||||
	}
 | 
			
		||||
	set_bit(PG_COMMIT_TO_DS, &req->wb_flags);
 | 
			
		||||
	cinfo->ds->nwritten++;
 | 
			
		||||
 | 
			
		||||
	/* nfs_request_add_commit_list(). We need to add req to list without
 | 
			
		||||
	 * dropping cinfo lock.
 | 
			
		||||
	 */
 | 
			
		||||
	set_bit(PG_CLEAN, &(req)->wb_flags);
 | 
			
		||||
	nfs_list_add_request(req, list);
 | 
			
		||||
	cinfo->mds->ncommit++;
 | 
			
		||||
	spin_unlock(cinfo->lock);
 | 
			
		||||
	if (!cinfo->dreq)
 | 
			
		||||
		nfs_mark_page_unstable(req->wb_page);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static u32 calc_ds_index_from_commit(struct pnfs_layout_segment *lseg, u32 i)
 | 
			
		||||
{
 | 
			
		||||
	return i;
 | 
			
		||||
| 
						 | 
				
			
			@ -1535,7 +1499,7 @@ static struct pnfs_layoutdriver_type flexfilelayout_type = {
 | 
			
		|||
	.pg_write_ops		= &ff_layout_pg_write_ops,
 | 
			
		||||
	.get_ds_info		= ff_layout_get_ds_info,
 | 
			
		||||
	.free_deviceid_node	= ff_layout_free_deveiceid_node,
 | 
			
		||||
	.mark_request_commit	= ff_layout_mark_request_commit,
 | 
			
		||||
	.mark_request_commit	= pnfs_layout_mark_request_commit,
 | 
			
		||||
	.clear_request_commit	= pnfs_generic_clear_request_commit,
 | 
			
		||||
	.scan_commit_lists	= pnfs_generic_scan_commit_lists,
 | 
			
		||||
	.recover_commit_reqs	= pnfs_generic_recover_commit_reqs,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -344,6 +344,10 @@ void nfs4_pnfs_ds_connect(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds,
 | 
			
		|||
struct nfs4_pnfs_ds_addr *nfs4_decode_mp_ds_addr(struct net *net,
 | 
			
		||||
						 struct xdr_stream *xdr,
 | 
			
		||||
						 gfp_t gfp_flags);
 | 
			
		||||
void pnfs_layout_mark_request_commit(struct nfs_page *req,
 | 
			
		||||
				     struct pnfs_layout_segment *lseg,
 | 
			
		||||
				     struct nfs_commit_info *cinfo,
 | 
			
		||||
				     u32 ds_commit_idx);
 | 
			
		||||
 | 
			
		||||
static inline bool nfs_have_layout(struct inode *inode)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -838,3 +838,33 @@ nfs4_decode_mp_ds_addr(struct net *net, struct xdr_stream *xdr, gfp_t gfp_flags)
 | 
			
		|||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(nfs4_decode_mp_ds_addr);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
pnfs_layout_mark_request_commit(struct nfs_page *req,
 | 
			
		||||
				struct pnfs_layout_segment *lseg,
 | 
			
		||||
				struct nfs_commit_info *cinfo,
 | 
			
		||||
				u32 ds_commit_idx)
 | 
			
		||||
{
 | 
			
		||||
	struct list_head *list;
 | 
			
		||||
	struct pnfs_commit_bucket *buckets;
 | 
			
		||||
 | 
			
		||||
	spin_lock(cinfo->lock);
 | 
			
		||||
	buckets = cinfo->ds->buckets;
 | 
			
		||||
	list = &buckets[ds_commit_idx].written;
 | 
			
		||||
	if (list_empty(list)) {
 | 
			
		||||
		/* Non-empty buckets hold a reference on the lseg.  That ref
 | 
			
		||||
		 * is normally transferred to the COMMIT call and released
 | 
			
		||||
		 * there.  It could also be released if the last req is pulled
 | 
			
		||||
		 * off due to a rewrite, in which case it will be done in
 | 
			
		||||
		 * pnfs_common_clear_request_commit
 | 
			
		||||
		 */
 | 
			
		||||
		WARN_ON_ONCE(buckets[ds_commit_idx].wlseg != NULL);
 | 
			
		||||
		buckets[ds_commit_idx].wlseg = pnfs_get_lseg(lseg);
 | 
			
		||||
	}
 | 
			
		||||
	set_bit(PG_COMMIT_TO_DS, &req->wb_flags);
 | 
			
		||||
	cinfo->ds->nwritten++;
 | 
			
		||||
	spin_unlock(cinfo->lock);
 | 
			
		||||
 | 
			
		||||
	nfs_request_add_commit_list(req, list, cinfo);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(pnfs_layout_mark_request_commit);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue