diff options
| author | 2018-07-10 20:55:20 -0600 | |
|---|---|---|
| committer | 2018-07-25 14:21:22 -0600 | |
| commit | 2c96eb7d62de5048aa08e9ee4fbb607f29e2638c (patch) | |
| tree | 3c73802d3c6661c6828c2f9fe881e4710875cf97 /drivers/infiniband/core | |
| parent | IB/uverbs: Rework the locking for cleaning up the ucontext (diff) | |
| download | linux-dev-2c96eb7d62de5048aa08e9ee4fbb607f29e2638c.tar.xz linux-dev-2c96eb7d62de5048aa08e9ee4fbb607f29e2638c.zip  | |
IB/uverbs: Always propagate errors from rdma_alloc_commit_uobject()
The ioctl framework already does this correctly, but the write path did
not. This is trivially fixed by simply using a standard pattern to return
uobj_alloc_commit() as the last statement in every function.
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Diffstat (limited to 'drivers/infiniband/core')
| -rw-r--r-- | drivers/infiniband/core/rdma_core.c | 5 | ||||
| -rw-r--r-- | drivers/infiniband/core/uverbs_cmd.c | 49 | 
2 files changed, 18 insertions, 36 deletions
diff --git a/drivers/infiniband/core/rdma_core.c b/drivers/infiniband/core/rdma_core.c index eeed6374134c..2aab8cd2ca6b 100644 --- a/drivers/infiniband/core/rdma_core.c +++ b/drivers/infiniband/core/rdma_core.c @@ -532,9 +532,10 @@ static void alloc_commit_fd_uobject(struct ib_uobject *uobj)  /*   * In all cases rdma_alloc_commit_uobject() consumes the kref to uobj and the - * caller can no longer assume uobj is valid. + * caller can no longer assume uobj is valid. If this function fails it + * destroys the uboject, including the attached HW object.   */ -int rdma_alloc_commit_uobject(struct ib_uobject *uobj) +int __must_check rdma_alloc_commit_uobject(struct ib_uobject *uobj)  {  	struct ib_uverbs_file *ufile = uobj->ufile; diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index f2611c760184..73b563edb587 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -372,9 +372,7 @@ ssize_t ib_uverbs_alloc_pd(struct ib_uverbs_file *file,  		goto err_copy;  	} -	uobj_alloc_commit(uobj); - -	return in_len; +	return uobj_alloc_commit(uobj, in_len);  err_copy:  	ib_dealloc_pd(pd); @@ -579,9 +577,7 @@ ssize_t ib_uverbs_open_xrcd(struct ib_uverbs_file *file,  	mutex_unlock(&file->device->xrcd_tree_mutex); -	uobj_alloc_commit(&obj->uobject); - -	return in_len; +	return uobj_alloc_commit(&obj->uobject, in_len);  err_copy:  	if (inode) { @@ -723,9 +719,7 @@ ssize_t ib_uverbs_reg_mr(struct ib_uverbs_file *file,  	uobj_put_obj_read(pd); -	uobj_alloc_commit(uobj); - -	return in_len; +	return uobj_alloc_commit(uobj, in_len);  err_copy:  	ib_dereg_mr(mr); @@ -901,9 +895,7 @@ ssize_t ib_uverbs_alloc_mw(struct ib_uverbs_file *file,  	}  	uobj_put_obj_read(pd); -	uobj_alloc_commit(uobj); - -	return in_len; +	return uobj_alloc_commit(uobj, in_len);  err_copy:  	uverbs_dealloc_mw(mw); @@ -959,8 +951,7 @@ ssize_t ib_uverbs_create_comp_channel(struct ib_uverbs_file *file,  		return -EFAULT;  	} -	uobj_alloc_commit(uobj); -	return in_len; +	return uobj_alloc_commit(uobj, in_len);  }  static struct ib_ucq_object *create_cq(struct ib_uverbs_file *file, @@ -1041,7 +1032,9 @@ static struct ib_ucq_object *create_cq(struct ib_uverbs_file *file,  	if (ret)  		goto err_cb; -	uobj_alloc_commit(&obj->uobject); +	ret = uobj_alloc_commit(&obj->uobject, 0); +	if (ret) +		return ERR_PTR(ret);  	return obj;  err_cb: @@ -1596,9 +1589,7 @@ static int create_qp(struct ib_uverbs_file *file,  	if (ind_tbl)  		uobj_put_obj_read(ind_tbl); -	uobj_alloc_commit(&obj->uevent.uobject); - -	return 0; +	return uobj_alloc_commit(&obj->uevent.uobject, 0);  err_cb:  	ib_destroy_qp(qp); @@ -1801,10 +1792,7 @@ ssize_t ib_uverbs_open_qp(struct ib_uverbs_file *file,  	qp->uobject = &obj->uevent.uobject;  	uobj_put_read(xrcd_uobj); - -	uobj_alloc_commit(&obj->uevent.uobject); - -	return in_len; +	return uobj_alloc_commit(&obj->uevent.uobject, in_len);  err_destroy:  	ib_destroy_qp(qp); @@ -2607,9 +2595,7 @@ ssize_t ib_uverbs_create_ah(struct ib_uverbs_file *file,  	}  	uobj_put_obj_read(pd); -	uobj_alloc_commit(uobj); - -	return in_len; +	return uobj_alloc_commit(uobj, in_len);  err_copy:  	rdma_destroy_ah(ah); @@ -3155,8 +3141,7 @@ int ib_uverbs_ex_create_wq(struct ib_uverbs_file *file,  	uobj_put_obj_read(pd);  	uobj_put_obj_read(cq); -	uobj_alloc_commit(&obj->uevent.uobject); -	return 0; +	return uobj_alloc_commit(&obj->uevent.uobject, 0);  err_copy:  	ib_destroy_wq(wq); @@ -3403,8 +3388,7 @@ int ib_uverbs_ex_create_rwq_ind_table(struct ib_uverbs_file *file,  	for (j = 0; j < num_read_wqs; j++)  		uobj_put_obj_read(wqs[j]); -	uobj_alloc_commit(uobj); -	return 0; +	return uobj_alloc_commit(uobj, 0);  err_copy:  	ib_destroy_rwq_ind_table(rwq_ind_tbl); @@ -3605,11 +3589,10 @@ int ib_uverbs_ex_create_flow(struct ib_uverbs_file *file,  		goto err_copy;  	uobj_put_obj_read(qp); -	uobj_alloc_commit(uobj);  	kfree(flow_attr);  	if (cmd.flow_attr.num_of_specs)  		kfree(kern_flow_attr); -	return 0; +	return uobj_alloc_commit(uobj, 0);  err_copy:  	if (!qp->device->destroy_flow(flow_id))  		atomic_dec(&qp->usecnt); @@ -3761,9 +3744,7 @@ static int __uverbs_create_xsrq(struct ib_uverbs_file *file,  		uobj_put_obj_read(attr.ext.cq);  	uobj_put_obj_read(pd); -	uobj_alloc_commit(&obj->uevent.uobject); - -	return 0; +	return uobj_alloc_commit(&obj->uevent.uobject, 0);  err_copy:  	ib_destroy_srq(srq);  | 
