Commit 590b6e75 authored by Ziye Yang's avatar Ziye Yang Committed by Tomasz Zawadzki
Browse files

nbd: Use async manner to stop nbd device.



Purpose: In order to free all the allocated resources.

Our current code uses sync behaviour, and it will not wait for all
the resources are freed if there is active I/Os, and thus we will
not free some resources, e.g., some fds will not be closed.

Signed-off-by: default avatarZiye Yang <ziye.yang@intel.com>
Change-Id: Iaf9a606da2049ffd0096860c46d89d094038a5ff
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/5601


Community-CI: Broadcom CI
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarSun Zhenyuan <sunzhenyuan@baidu.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatar <dongx.yi@intel.com>
parent ac74de2f
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -29,6 +29,11 @@ An `opts_size`element was added in the `spdk_app_opts` structure
to solve the ABI compatiblity issue between different SPDK version. An `opts_size`
parameter is added into `spdk_app_opts_init` function.

### nbd

Change the return type of function `spdk_nbd_stop` from void to int. And update the
`spdk_nbd_fini` with two parameters to make its behavior from sync to async.

### nvmf

Broadcom FC LLD driver and SPDK NVMe-oF FC transport consolidated one LLD API,
+8 −2
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ extern "C" {
struct spdk_bdev;
struct spdk_nbd_disk;
struct spdk_json_write_ctx;
typedef void (*spdk_nbd_fini_cb)(void *arg);

/**
 * Initialize the network block device layer.
@@ -55,8 +56,11 @@ int spdk_nbd_init(void);

/**
 * Stop and close all the running network block devices.
 *
 * \param cb_fn Callback to be always called.
 * \param cb_arg Passed to cb_fn.
 */
void spdk_nbd_fini(void);
void spdk_nbd_fini(spdk_nbd_fini_cb cb_fn, void *cb_arg);

/**
 * Called when an NBD device has been started.
@@ -80,8 +84,10 @@ void spdk_nbd_start(const char *bdev_name, const char *nbd_path,
 * Stop the running network block device safely.
 *
 * \param nbd A pointer to the network block device to stop.
 *
 * \return 0 on success.
 */
void spdk_nbd_stop(struct spdk_nbd_disk *nbd);
int spdk_nbd_stop(struct spdk_nbd_disk *nbd);

/**
 * Get the local filesystem path used for the network block device.
+1 −1
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@
SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..)
include $(SPDK_ROOT_DIR)/mk/spdk.common.mk

SO_VER := 2
SO_VER := 3
SO_MINOR := 0

LIBNAME = nbd
+33 −6
Original line number Diff line number Diff line
@@ -120,6 +120,8 @@ struct spdk_nbd_disk_globals {
};

static struct spdk_nbd_disk_globals g_spdk_nbd;
static spdk_nbd_fini_cb g_fini_cb_fn;
static void *g_fini_cb_arg;

static int
nbd_submit_bdev_io(struct spdk_nbd_disk *nbd, struct nbd_io *io);
@@ -132,10 +134,11 @@ spdk_nbd_init(void)
	return 0;
}

void
spdk_nbd_fini(void)
static void
_nbd_fini(void *arg1)
{
	struct spdk_nbd_disk *nbd_idx, *nbd_tmp;
	int rc = 0;

	/*
	 * Stop running spdk_nbd_disk.
@@ -144,10 +147,28 @@ spdk_nbd_fini(void)
	 * remove nbd from TAILQ.
	 */
	TAILQ_FOREACH_SAFE(nbd_idx, &g_spdk_nbd.disk_head, tailq, nbd_tmp) {
		spdk_nbd_stop(nbd_idx);
		rc = spdk_nbd_stop(nbd_idx);
		if (rc) {
			break;
		}
	}

	if (!rc) {
		g_fini_cb_fn(g_fini_cb_arg);
	} else {
		spdk_thread_send_msg(spdk_get_thread(), _nbd_fini, NULL);
	}
}

void
spdk_nbd_fini(spdk_nbd_fini_cb cb_fn, void *cb_arg)
{
	g_fini_cb_fn = cb_fn;
	g_fini_cb_arg = cb_arg;

	_nbd_fini(NULL);
}

static int
nbd_disk_register(struct spdk_nbd_disk *nbd)
{
@@ -388,11 +409,13 @@ _nbd_stop(struct spdk_nbd_disk *nbd)
	free(nbd);
}

void
int
spdk_nbd_stop(struct spdk_nbd_disk *nbd)
{
	int rc = 0;

	if (nbd == NULL) {
		return;
		return rc;
	}

	nbd->state = NBD_DISK_STATE_HARDDISC;
@@ -400,9 +423,13 @@ spdk_nbd_stop(struct spdk_nbd_disk *nbd)
	/*
	 * Stop action should be called only after all nbd_io are executed.
	 */
	if (!nbd_cleanup_io(nbd)) {

	rc = nbd_cleanup_io(nbd);
	if (!rc) {
		_nbd_stop(nbd);
	}

	return rc;
}

static int64_t
+7 −2
Original line number Diff line number Diff line
@@ -48,12 +48,17 @@ nbd_subsystem_init(void)
}

static void
nbd_subsystem_fini(void)
nbd_subsystem_fini_done(void *arg)
{
	spdk_nbd_fini();
	spdk_subsystem_fini_next();
}

static void
nbd_subsystem_fini(void)
{
	spdk_nbd_fini(nbd_subsystem_fini_done, NULL);
}

static void
nbd_subsystem_write_config_json(struct spdk_json_write_ctx *w)
{