bdev/iscsi: properly free pending connections on module fini

Besides the obvious memory leaks, we also need
to call the async completion callback, which may
also free some resources.

Change-Id: Ia80799be4b220053b82dfb4ee2453181c90136a1
Signed-off-by: Dariusz Stojaczyk <dariuszx.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/420571
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Dariusz Stojaczyk 2018-07-26 19:44:51 +02:00 committed by Ben Walker
parent 9668121208
commit dbd4e57994

View File

@ -103,6 +103,25 @@ struct bdev_iscsi_conn_req {
TAILQ_ENTRY(bdev_iscsi_conn_req) link;
};
static void
complete_conn_req(struct bdev_iscsi_conn_req *req, struct spdk_bdev *bdev,
int status)
{
TAILQ_REMOVE(&g_iscsi_conn_req, req, link);
req->create_cb(req->create_cb_arg, bdev, status);
if (status) {
/* if the request failed and no iscsi lun was
* created then we could not hand over this
* memory and have to free it manually now.
*/
iscsi_destroy_context(req->context);
free(req->initiator_iqn);
free(req->bdev_name);
free(req->url);
}
free(req);
}
static int
bdev_iscsi_get_ctx_size(void)
{
@ -133,8 +152,7 @@ bdev_iscsi_finish(void)
while (!TAILQ_EMPTY(&g_iscsi_conn_req)) {
req = TAILQ_FIRST(&g_iscsi_conn_req);
TAILQ_REMOVE(&g_iscsi_conn_req, req, link);
free(req);
complete_conn_req(req, NULL, -EINTR);
}
if (g_conn_poller) {
@ -567,25 +585,6 @@ static const struct spdk_bdev_fn_table iscsi_fn_table = {
.write_config_json = bdev_iscsi_write_config_json,
};
static void
complete_conn_req(struct bdev_iscsi_conn_req *req, struct spdk_bdev *bdev,
int status)
{
TAILQ_REMOVE(&g_iscsi_conn_req, req, link);
req->create_cb(req->create_cb_arg, bdev, status);
if (status) {
/* if the request failed and no iscsi lun was
* created then we could not hand over this
* memory and have to free it manually now.
*/
iscsi_destroy_context(req->context);
free(req->initiator_iqn);
free(req->bdev_name);
free(req->url);
}
free(req);
}
static int
create_iscsi_lun(struct iscsi_context *context, char *url, char *initiator_iqn, char *name,
uint64_t num_blocks, uint32_t block_size, struct spdk_bdev **bdev, bool unmap_supported)