Commit da9d2f07 authored by Roland Dreier's avatar Roland Dreier

IB/srp: Clean up error path in srp_create_target_ib()

Instead of repeating the error unwinding steps in each place an error
can be detected, use the common idiom of gotos into an error flow.
Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
parent 9c03dc9f
...@@ -232,15 +232,14 @@ static int srp_create_target_ib(struct srp_target_port *target) ...@@ -232,15 +232,14 @@ static int srp_create_target_ib(struct srp_target_port *target)
srp_recv_completion, NULL, target, SRP_RQ_SIZE, 0); srp_recv_completion, NULL, target, SRP_RQ_SIZE, 0);
if (IS_ERR(target->recv_cq)) { if (IS_ERR(target->recv_cq)) {
ret = PTR_ERR(target->recv_cq); ret = PTR_ERR(target->recv_cq);
goto out; goto err;
} }
target->send_cq = ib_create_cq(target->srp_host->srp_dev->dev, target->send_cq = ib_create_cq(target->srp_host->srp_dev->dev,
srp_send_completion, NULL, target, SRP_SQ_SIZE, 0); srp_send_completion, NULL, target, SRP_SQ_SIZE, 0);
if (IS_ERR(target->send_cq)) { if (IS_ERR(target->send_cq)) {
ret = PTR_ERR(target->send_cq); ret = PTR_ERR(target->send_cq);
ib_destroy_cq(target->recv_cq); goto err_recv_cq;
goto out;
} }
ib_req_notify_cq(target->recv_cq, IB_CQ_NEXT_COMP); ib_req_notify_cq(target->recv_cq, IB_CQ_NEXT_COMP);
...@@ -258,20 +257,26 @@ static int srp_create_target_ib(struct srp_target_port *target) ...@@ -258,20 +257,26 @@ static int srp_create_target_ib(struct srp_target_port *target)
target->qp = ib_create_qp(target->srp_host->srp_dev->pd, init_attr); target->qp = ib_create_qp(target->srp_host->srp_dev->pd, init_attr);
if (IS_ERR(target->qp)) { if (IS_ERR(target->qp)) {
ret = PTR_ERR(target->qp); ret = PTR_ERR(target->qp);
ib_destroy_cq(target->send_cq); goto err_send_cq;
ib_destroy_cq(target->recv_cq);
goto out;
} }
ret = srp_init_qp(target, target->qp); ret = srp_init_qp(target, target->qp);
if (ret) { if (ret)
ib_destroy_qp(target->qp); goto err_qp;
ib_destroy_cq(target->send_cq);
ib_destroy_cq(target->recv_cq);
goto out;
}
out: kfree(init_attr);
return 0;
err_qp:
ib_destroy_qp(target->qp);
err_send_cq:
ib_destroy_cq(target->send_cq);
err_recv_cq:
ib_destroy_cq(target->recv_cq);
err:
kfree(init_attr); kfree(init_attr);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment