diff options
Diffstat (limited to 'net/rds/message.c')
| -rw-r--r-- | net/rds/message.c | 25 | 
1 files changed, 9 insertions, 16 deletions
diff --git a/net/rds/message.c b/net/rds/message.c index 50f13f1d4ae0..071a261fdaab 100644 --- a/net/rds/message.c +++ b/net/rds/message.c @@ -1,5 +1,5 @@  /* - * Copyright (c) 2006 Oracle.  All rights reserved. + * Copyright (c) 2006, 2020 Oracle and/or its affiliates.   *   * This software is available to you under a choice of one of two   * licenses.  You may choose to be licensed under the terms of the GNU @@ -162,12 +162,12 @@ static void rds_message_purge(struct rds_message *rm)  	if (rm->rdma.op_active)  		rds_rdma_free_op(&rm->rdma);  	if (rm->rdma.op_rdma_mr) -		rds_mr_put(rm->rdma.op_rdma_mr); +		kref_put(&rm->rdma.op_rdma_mr->r_kref, __rds_put_mr_final);  	if (rm->atomic.op_active)  		rds_atomic_free_op(&rm->atomic);  	if (rm->atomic.op_rdma_mr) -		rds_mr_put(rm->atomic.op_rdma_mr); +		kref_put(&rm->atomic.op_rdma_mr->r_kref, __rds_put_mr_final);  }  void rds_message_put(struct rds_message *rm) @@ -308,26 +308,20 @@ out:  /*   * RDS ops use this to grab SG entries from the rm's sg pool.   */ -struct scatterlist *rds_message_alloc_sgs(struct rds_message *rm, int nents, -					  int *ret) +struct scatterlist *rds_message_alloc_sgs(struct rds_message *rm, int nents)  {  	struct scatterlist *sg_first = (struct scatterlist *) &rm[1];  	struct scatterlist *sg_ret; -	if (WARN_ON(!ret)) -		return NULL; -  	if (nents <= 0) {  		pr_warn("rds: alloc sgs failed! nents <= 0\n"); -		*ret = -EINVAL; -		return NULL; +		return ERR_PTR(-EINVAL);  	}  	if (rm->m_used_sgs + nents > rm->m_total_sgs) {  		pr_warn("rds: alloc sgs failed! total %d used %d nents %d\n",  			rm->m_total_sgs, rm->m_used_sgs, nents); -		*ret = -ENOMEM; -		return NULL; +		return ERR_PTR(-ENOMEM);  	}  	sg_ret = &sg_first[rm->m_used_sgs]; @@ -343,7 +337,6 @@ struct rds_message *rds_message_map_pages(unsigned long *page_addrs, unsigned in  	unsigned int i;  	int num_sgs = DIV_ROUND_UP(total_len, PAGE_SIZE);  	int extra_bytes = num_sgs * sizeof(struct scatterlist); -	int ret;  	rm = rds_message_alloc(extra_bytes, GFP_NOWAIT);  	if (!rm) @@ -352,10 +345,10 @@ struct rds_message *rds_message_map_pages(unsigned long *page_addrs, unsigned in  	set_bit(RDS_MSG_PAGEVEC, &rm->m_flags);  	rm->m_inc.i_hdr.h_len = cpu_to_be32(total_len);  	rm->data.op_nents = DIV_ROUND_UP(total_len, PAGE_SIZE); -	rm->data.op_sg = rds_message_alloc_sgs(rm, num_sgs, &ret); -	if (!rm->data.op_sg) { +	rm->data.op_sg = rds_message_alloc_sgs(rm, num_sgs); +	if (IS_ERR(rm->data.op_sg)) {  		rds_message_put(rm); -		return ERR_PTR(ret); +		return ERR_CAST(rm->data.op_sg);  	}  	for (i = 0; i < rm->data.op_nents; ++i) {  | 
