diff options
Diffstat (limited to 'fs/nfs/write.c')
| -rw-r--r-- | fs/nfs/write.c | 25 | 
1 files changed, 13 insertions, 12 deletions
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index f4cca8f00c0c..7720b5e43014 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c @@ -59,7 +59,8 @@ static const struct nfs_pgio_completion_ops nfs_async_write_completion_ops;  static const struct nfs_commit_completion_ops nfs_commit_completion_ops;  static const struct nfs_rw_ops nfs_rw_write_ops;  static void nfs_inode_remove_request(struct nfs_page *req); -static void nfs_clear_request_commit(struct nfs_page *req); +static void nfs_clear_request_commit(struct nfs_commit_info *cinfo, +				     struct nfs_page *req);  static void nfs_init_cinfo_from_inode(struct nfs_commit_info *cinfo,  				      struct inode *inode);  static struct nfs_page * @@ -502,8 +503,8 @@ nfs_destroy_unlinked_subrequests(struct nfs_page *destroy_list,   * the (former) group.  All subrequests are removed from any write or commit   * lists, unlinked from the group and destroyed.   */ -void -nfs_join_page_group(struct nfs_page *head, struct inode *inode) +void nfs_join_page_group(struct nfs_page *head, struct nfs_commit_info *cinfo, +			 struct inode *inode)  {  	struct nfs_page *subreq;  	struct nfs_page *destroy_list = NULL; @@ -533,7 +534,7 @@ nfs_join_page_group(struct nfs_page *head, struct inode *inode)  	 * Commit list removal accounting is done after locks are dropped */  	subreq = head;  	do { -		nfs_clear_request_commit(subreq); +		nfs_clear_request_commit(cinfo, subreq);  		subreq = subreq->wb_this_page;  	} while (subreq != head); @@ -566,8 +567,10 @@ static struct nfs_page *nfs_lock_and_join_requests(struct folio *folio)  {  	struct inode *inode = folio_file_mapping(folio)->host;  	struct nfs_page *head; +	struct nfs_commit_info cinfo;  	int ret; +	nfs_init_cinfo_from_inode(&cinfo, inode);  	/*  	 * A reference is taken only on the head request which acts as a  	 * reference to the whole page group - the group will not be destroyed @@ -584,7 +587,7 @@ static struct nfs_page *nfs_lock_and_join_requests(struct folio *folio)  		return ERR_PTR(ret);  	} -	nfs_join_page_group(head, inode); +	nfs_join_page_group(head, &cinfo, inode);  	return head;  } @@ -799,8 +802,8 @@ static void nfs_inode_remove_request(struct nfs_page *req)  	}  	if (test_and_clear_bit(PG_INODE_REF, &req->wb_flags)) { -		nfs_release_request(req);  		atomic_long_dec(&NFS_I(nfs_page_to_inode(req))->nrequests); +		nfs_release_request(req);  	}  } @@ -955,18 +958,16 @@ static void nfs_folio_clear_commit(struct folio *folio)  }  /* Called holding the request lock on @req */ -static void -nfs_clear_request_commit(struct nfs_page *req) +static void nfs_clear_request_commit(struct nfs_commit_info *cinfo, +				     struct nfs_page *req)  {  	if (test_bit(PG_CLEAN, &req->wb_flags)) {  		struct nfs_open_context *ctx = nfs_req_openctx(req);  		struct inode *inode = d_inode(ctx->dentry); -		struct nfs_commit_info cinfo; -		nfs_init_cinfo_from_inode(&cinfo, inode);  		mutex_lock(&NFS_I(inode)->commit_mutex); -		if (!pnfs_clear_request_commit(req, &cinfo)) { -			nfs_request_remove_commit_list(req, &cinfo); +		if (!pnfs_clear_request_commit(req, cinfo)) { +			nfs_request_remove_commit_list(req, cinfo);  		}  		mutex_unlock(&NFS_I(inode)->commit_mutex);  		nfs_folio_clear_commit(nfs_page_to_folio(req));  | 
