Commit e54df32e authored by MengjinWu's avatar MengjinWu Committed by Tomasz Zawadzki
Browse files

lib/nbd: refine nbd stop process



nbd will be closed in nbd poller function asychronously.
Unify the stop process of HARDDISC and SOFTDISC in same place.
Prepare for following patch.

Signed-off-by: default avatarMengjinWu <mengjin.wu@intel.com>
Change-Id: Ida33ff6d081e68290cfa393c0c47fe7af545958b
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/8036


Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarXiaodong Liu <xiaodong.liu@intel.com>
Reviewed-by: default avatarGangCao <gang.cao@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarZiye Yang <ziye.yang@intel.com>
parent 9ab0ffcc
Loading
Loading
Loading
Loading
+11 −34
Original line number Diff line number Diff line
@@ -310,24 +310,6 @@ nbd_put_io(struct spdk_nbd_disk *nbd, struct nbd_io *io)
	nbd->io_count--;
}

/*
 * Check whether received nbd_io are all transmitted.
 *
 * \return 1 there is still some nbd_io not transmitted.
 *         0 all nbd_io received are transmitted.
 */
static int
nbd_io_xmit_check(struct spdk_nbd_disk *nbd)
{
	if (nbd->io_count == 0) {
		return 0;
	} else if (nbd->io_count == 1 && nbd->io_in_recv != NULL) {
		return 0;
	}

	return 1;
}

/*
 * Check whether received nbd_io are all executed,
 * and put back executed nbd_io instead of transmitting them
@@ -503,10 +485,6 @@ nbd_io_done(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg)
	if (bdev_io != NULL) {
		spdk_bdev_free_io(bdev_io);
	}

	if (nbd->state == NBD_DISK_STATE_HARDDISC && !nbd_cleanup_io(nbd)) {
		_nbd_stop(nbd);
	}
}

static void
@@ -833,14 +811,6 @@ nbd_io_xmit(struct spdk_nbd_disk *nbd)
		spdk_interrupt_set_event_types(nbd->intr, SPDK_INTERRUPT_EVENT_IN);
	}

	/*
	 * For soft disconnection, nbd server can close connection after all
	 * outstanding request are transmitted.
	 */
	if (nbd->state == NBD_DISK_STATE_SOFTDISC && !nbd_io_xmit_check(nbd)) {
		return -1;
	}

	return ret;
}

@@ -883,8 +853,15 @@ nbd_poll(void *arg)
	if (rc < 0) {
		SPDK_INFOLOG(nbd, "nbd_poll() returned %s (%d); closing connection\n",
			     spdk_strerror(-rc), rc);
		_nbd_stop(nbd);
	}
	if (nbd->state != NBD_DISK_STATE_RUNNING) {
		if (nbd->state == NBD_DISK_STATE_HARDDISC && !nbd_cleanup_io(nbd)) {
			_nbd_stop(nbd);
		} else if (nbd->state == NBD_DISK_STATE_SOFTDISC) {
			spdk_nbd_stop(nbd);
		}
	}

	return rc > 0 ? SPDK_POLLER_BUSY : SPDK_POLLER_IDLE;
}
@@ -1016,7 +993,7 @@ nbd_start_complete(struct spdk_nbd_start_ctx *ctx)
	return;

err:
	spdk_nbd_stop(ctx->nbd);
	_nbd_stop(ctx->nbd);
	if (ctx->cb_fn) {
		ctx->cb_fn(ctx->cb_arg, NULL, rc);
	}
@@ -1053,7 +1030,7 @@ nbd_enable_kernel(void *arg)
			spdk_poller_unregister(&ctx->nbd->retry_poller);
		}

		spdk_nbd_stop(ctx->nbd);
		_nbd_stop(ctx->nbd);

		if (ctx->cb_fn) {
			ctx->cb_fn(ctx->cb_arg, NULL, -errno);
@@ -1155,7 +1132,7 @@ spdk_nbd_start(const char *bdev_name, const char *nbd_path,
err:
	free(ctx);
	if (nbd) {
		spdk_nbd_stop(nbd);
		_nbd_stop(nbd);
	}

	if (cb_fn) {