lib/nvmf: Free listener if executing listening failed.

We callocated the listener, but if we to execute the listening
behaviors which got failed, and all the other resources have been released,
only left listener.

Fixes issue #1326.

Signed-off-by: yidong0635 <dongx.yi@intel.com>
Change-Id: I020b509caed79e9880d07b01888ed389630ff67f
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1595
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
This commit is contained in:
yidong0635 2020-03-31 07:17:01 -04:00 committed by Tomasz Zawadzki
parent 2f585d32c8
commit fdd5151e6b

View File

@ -208,6 +208,7 @@ spdk_nvmf_transport_listen(struct spdk_nvmf_transport *transport,
const struct spdk_nvme_transport_id *trid)
{
struct spdk_nvmf_listener *listener;
int rc;
listener = spdk_nvmf_transport_find_listener(transport, trid);
if (!listener) {
@ -219,7 +220,13 @@ spdk_nvmf_transport_listen(struct spdk_nvmf_transport *transport,
listener->ref = 1;
listener->trid = *trid;
TAILQ_INSERT_TAIL(&transport->listeners, listener, link);
return transport->ops->listen(transport, &listener->trid);
rc = transport->ops->listen(transport, &listener->trid);
if (rc != 0) {
TAILQ_REMOVE(&transport->listeners, listener, link);
free(listener);
}
return rc;
}
++listener->ref;