Commit 2f48218a authored by Naresh Gottumukkala's avatar Naresh Gottumukkala Committed by Jim Harris
Browse files

nvmf/fc: free g_nvmf_ftransport after nvmf_fc_lld_fini is complete.



Dont free g_nvmf_ftransport before LLD finishes its cleanup.

Signed-off-by: default avatarNaresh Gottumukkala <raju.gottumukkala@broadcom.com>
Change-Id: I61693fbe1afe0b4f6b52828d3149175419457487
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/5963


Community-CI: Broadcom CI
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent d0657f32
Loading
Loading
Loading
Loading
+14 −6
Original line number Diff line number Diff line
@@ -236,6 +236,8 @@ struct spdk_nvmf_fc_transport {

static struct spdk_nvmf_fc_transport *g_nvmf_ftransport;

static spdk_nvmf_transport_destroy_done_cb g_transport_destroy_done_cb = NULL;

static TAILQ_HEAD(, spdk_nvmf_fc_port) g_spdk_nvmf_fc_port_list =
	TAILQ_HEAD_INITIALIZER(g_spdk_nvmf_fc_port_list);

@@ -2011,27 +2013,33 @@ nvmf_fc_create(struct spdk_nvmf_transport_opts *opts)
	return &g_nvmf_ftransport->transport;
}

static void
nvmf_fc_destroy_done_cb(void *cb_arg)
{
	free(g_nvmf_ftransport);
	if (g_transport_destroy_done_cb) {
		g_transport_destroy_done_cb(cb_arg);
		g_transport_destroy_done_cb = NULL;
	}
}

static int
nvmf_fc_destroy(struct spdk_nvmf_transport *transport,
		spdk_nvmf_transport_destroy_done_cb cb_fn, void *cb_arg)
{
	if (transport) {
		struct spdk_nvmf_fc_transport *ftransport;
		struct spdk_nvmf_fc_poll_group *fgroup, *pg_tmp;

		ftransport = SPDK_CONTAINEROF(transport, struct spdk_nvmf_fc_transport, transport);

		free(ftransport);

		/* clean up any FC poll groups still around */
		TAILQ_FOREACH_SAFE(fgroup, &g_nvmf_fgroups, link, pg_tmp) {
			TAILQ_REMOVE(&g_nvmf_fgroups, fgroup, link);
			free(fgroup);
		}
		g_nvmf_fgroup_count = 0;
		g_transport_destroy_done_cb = cb_fn;

		/* low level FC driver clean up */
		nvmf_fc_lld_fini(cb_fn, cb_arg);
		nvmf_fc_lld_fini(nvmf_fc_destroy_done_cb, cb_arg);
	}

	return 0;