diff options
Diffstat (limited to 'fs/nfs/pnfs_nfs.c')
| -rw-r--r-- | fs/nfs/pnfs_nfs.c | 22 | 
1 files changed, 10 insertions, 12 deletions
diff --git a/fs/nfs/pnfs_nfs.c b/fs/nfs/pnfs_nfs.c index 2efcfdd348a1..49d3389bd813 100644 --- a/fs/nfs/pnfs_nfs.c +++ b/fs/nfs/pnfs_nfs.c @@ -78,22 +78,18 @@ void  pnfs_generic_clear_request_commit(struct nfs_page *req,  				  struct nfs_commit_info *cinfo)  { -	struct pnfs_layout_segment *freeme = NULL; +	struct pnfs_commit_bucket *bucket = NULL;  	if (!test_and_clear_bit(PG_COMMIT_TO_DS, &req->wb_flags))  		goto out;  	cinfo->ds->nwritten--; -	if (list_is_singular(&req->wb_list)) { -		struct pnfs_commit_bucket *bucket; - +	if (list_is_singular(&req->wb_list))  		bucket = list_first_entry(&req->wb_list, -					  struct pnfs_commit_bucket, -					  written); -		freeme = pnfs_free_bucket_lseg(bucket); -	} +					  struct pnfs_commit_bucket, written);  out:  	nfs_request_remove_commit_list(req, cinfo); -	pnfs_put_lseg(freeme); +	if (bucket) +		pnfs_put_lseg(pnfs_free_bucket_lseg(bucket));  }  EXPORT_SYMBOL_GPL(pnfs_generic_clear_request_commit); @@ -407,12 +403,16 @@ pnfs_bucket_get_committing(struct list_head *head,  			   struct pnfs_commit_bucket *bucket,  			   struct nfs_commit_info *cinfo)  { +	struct pnfs_layout_segment *lseg;  	struct list_head *pos;  	list_for_each(pos, &bucket->committing)  		cinfo->ds->ncommitting--;  	list_splice_init(&bucket->committing, head); -	return pnfs_free_bucket_lseg(bucket); +	lseg = pnfs_free_bucket_lseg(bucket); +	if (!lseg) +		lseg = pnfs_get_lseg(bucket->lseg); +	return lseg;  }  static struct nfs_commit_data * @@ -424,8 +424,6 @@ pnfs_bucket_fetch_commitdata(struct pnfs_commit_bucket *bucket,  	if (!data)  		return NULL;  	data->lseg = pnfs_bucket_get_committing(&data->pages, bucket, cinfo); -	if (!data->lseg) -		data->lseg = pnfs_get_lseg(bucket->lseg);  	return data;  }  | 
