Commit 050346e0 authored by Ben Walker's avatar Ben Walker Committed by Tomasz Zawadzki
Browse files

bdev/nvme: Add accessors for getting namespaces



Try to use these accessors instead of directly using the namespaces
array. This will make changing the data structure easier later on.

Change-Id: I3367d0e0065894f3aa199ed1698d27976b4cbbb5
Signed-off-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9315


Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent 282b8b70
Loading
Loading
Loading
Loading
+13 −22
Original line number Diff line number Diff line
@@ -349,7 +349,7 @@ bdev_nvme_destruct(void *ctx)

	assert(nvme_ns->id > 0);

	if (nvme_ns->ctrlr->namespaces[nvme_ns->id - 1] == NULL) {
	if (nvme_ctrlr_get_ns(nvme_ns->ctrlr, nvme_ns->id) == NULL) {
		pthread_mutex_unlock(&nvme_ns->ctrlr->mutex);

		nvme_ctrlr_release(nvme_ns->ctrlr);
@@ -1776,7 +1776,7 @@ nvme_ctrlr_populate_namespaces(struct nvme_ctrlr *nvme_ctrlr,
	for (i = 0; i < nvme_ctrlr->num_ns; i++) {
		uint32_t	nsid = i + 1;

		nvme_ns = nvme_ctrlr->namespaces[i];
		nvme_ns = nvme_ctrlr_get_ns(nvme_ctrlr, nsid);
		ns_is_active = spdk_nvme_ctrlr_is_active_ns(ctrlr, nsid);

		if (nvme_ns != NULL && ns_is_active) {
@@ -1848,7 +1848,7 @@ nvme_ctrlr_depopulate_namespaces(struct nvme_ctrlr *nvme_ctrlr)
	for (i = 0; i < nvme_ctrlr->num_ns; i++) {
		uint32_t nsid = i + 1;

		nvme_ns = nvme_ctrlr->namespaces[nsid - 1];
		nvme_ns = nvme_ctrlr_get_ns(nvme_ctrlr, nsid);
		if (nvme_ns != NULL) {
			assert(nvme_ns->id == nsid);
			nvme_ctrlr_depopulate_namespace(nvme_ctrlr, nvme_ns);
@@ -1883,7 +1883,7 @@ nvme_ctrlr_set_ana_states(const struct spdk_nvme_ana_group_descriptor *desc,
			continue;
		}

		nvme_ns = nvme_ctrlr->namespaces[nsid - 1];
		nvme_ns = nvme_ctrlr_get_ns(nvme_ctrlr, nsid);

		assert(nvme_ns != NULL);
		if (nvme_ns == NULL) {
@@ -2375,7 +2375,6 @@ nvme_ctrlr_populate_namespaces_done(struct nvme_ctrlr *nvme_ctrlr,
{
	struct nvme_ns	*nvme_ns;
	struct nvme_bdev	*nvme_bdev;
	uint32_t		i, nsid;
	size_t			j;

	assert(nvme_ctrlr != NULL);
@@ -2385,13 +2384,8 @@ nvme_ctrlr_populate_namespaces_done(struct nvme_ctrlr *nvme_ctrlr,
	 * There can be more than one bdev per NVMe controller.
	 */
	j = 0;
	for (i = 0; i < nvme_ctrlr->num_ns; i++) {
		nsid = i + 1;
		nvme_ns = nvme_ctrlr->namespaces[nsid - 1];
		if (nvme_ns == NULL) {
			continue;
		}
		assert(nvme_ns->id == nsid);
	nvme_ns = nvme_ctrlr_get_first_active_ns(nvme_ctrlr);
	while (nvme_ns != NULL) {
		nvme_bdev = nvme_ns->bdev;
		if (j < ctx->count) {
			ctx->names[j] = nvme_bdev->disk.name;
@@ -2402,6 +2396,8 @@ nvme_ctrlr_populate_namespaces_done(struct nvme_ctrlr *nvme_ctrlr,
			populate_namespaces_cb(ctx, 0, -ERANGE);
			return;
		}

		nvme_ns = nvme_ctrlr_get_next_active_ns(nvme_ctrlr, nvme_ns);
	}

	populate_namespaces_cb(ctx, j, 0);
@@ -2443,7 +2439,6 @@ static int
bdev_nvme_compare_namespaces(struct nvme_ctrlr *nvme_ctrlr,
			     struct spdk_nvme_ctrlr *new_ctrlr)
{
	uint32_t i, nsid;
	struct nvme_ns *nvme_ns;
	struct spdk_nvme_ns *new_ns;

@@ -2451,20 +2446,16 @@ bdev_nvme_compare_namespaces(struct nvme_ctrlr *nvme_ctrlr,
		return -EINVAL;
	}

	for (i = 0; i < nvme_ctrlr->num_ns; i++) {
		nsid = i + 1;

		nvme_ns = nvme_ctrlr->namespaces[i];
		if (nvme_ns == NULL) {
			continue;
		}

		new_ns = spdk_nvme_ctrlr_get_ns(new_ctrlr, nsid);
	nvme_ns = nvme_ctrlr_get_first_active_ns(nvme_ctrlr);
	while (nvme_ns != NULL) {
		new_ns = spdk_nvme_ctrlr_get_ns(new_ctrlr, nvme_ns->id);
		assert(new_ns != NULL);

		if (!bdev_nvme_compare_ns(nvme_ns->ns, new_ns)) {
			return -EINVAL;
		}

		nvme_ns = nvme_ctrlr_get_next_active_ns(nvme_ctrlr, nvme_ns);
	}

	return 0;
+47 −0
Original line number Diff line number Diff line
@@ -38,6 +38,53 @@ struct nvme_ctrlrs g_nvme_ctrlrs = TAILQ_HEAD_INITIALIZER(g_nvme_ctrlrs);
pthread_mutex_t g_bdev_nvme_mutex = PTHREAD_MUTEX_INITIALIZER;
bool g_bdev_nvme_module_finish;

struct nvme_ns *
nvme_ctrlr_get_ns(struct nvme_ctrlr *nvme_ctrlr, uint32_t nsid)
{
	assert(nsid > 0);
	assert(nsid <= nvme_ctrlr->num_ns);
	if (nsid == 0 || nsid > nvme_ctrlr->num_ns) {
		return NULL;
	}

	return nvme_ctrlr->namespaces[nsid - 1];
}

struct nvme_ns *
nvme_ctrlr_get_first_active_ns(struct nvme_ctrlr *nvme_ctrlr)
{
	uint32_t i;

	for (i = 0; i < nvme_ctrlr->num_ns; i++) {
		if (nvme_ctrlr->namespaces[i] != NULL) {
			return nvme_ctrlr->namespaces[i];
		}
	}

	return NULL;
}

struct nvme_ns *
nvme_ctrlr_get_next_active_ns(struct nvme_ctrlr *nvme_ctrlr, struct nvme_ns *ns)
{
	uint32_t i;

	if (ns == NULL) {
		return NULL;
	}

	/* ns->id is a 1's based value and we want to start at the next
	 * entry in this array, so we start at ns->id and don't subtract to
	 * convert to 0's based. */
	for (i = ns->id; i < nvme_ctrlr->num_ns; i++) {
		if (nvme_ctrlr->namespaces[i] != NULL) {
			return nvme_ctrlr->namespaces[i];
		}
	}

	return NULL;
}

struct nvme_ctrlr *
nvme_ctrlr_get(const struct spdk_nvme_transport_id *trid)
{
+4 −0
Original line number Diff line number Diff line
@@ -177,4 +177,8 @@ void nvme_ctrlr_delete(struct nvme_ctrlr *nvme_ctrlr);
int bdev_nvme_create_bdev_channel_cb(void *io_device, void *ctx_buf);
void bdev_nvme_destroy_bdev_channel_cb(void *io_device, void *ctx_buf);

struct nvme_ns *nvme_ctrlr_get_ns(struct nvme_ctrlr *nvme_ctrlr, uint32_t nsid);
struct nvme_ns *nvme_ctrlr_get_first_active_ns(struct nvme_ctrlr *nvme_ctrlr);
struct nvme_ns *nvme_ctrlr_get_next_active_ns(struct nvme_ctrlr *nvme_ctrlr, struct nvme_ns *ns);

#endif /* SPDK_COMMON_BDEV_NVME_H */
+1 −1
Original line number Diff line number Diff line
@@ -357,7 +357,7 @@ vbdev_opal_create(const char *nvme_ctrlr_name, uint32_t nsid, uint8_t locking_ra
	opal_bdev->opal_dev = nvme_ctrlr->opal_dev;

	assert(nsid <= nvme_ctrlr->num_ns);
	nvme_bdev = nvme_ctrlr->namespaces[nsid - 1]->bdev;
	nvme_bdev = nvme_ctrlr_get_ns(nvme_ctrlr, nsid)->bdev;
	assert(nvme_bdev != NULL);
	base_bdev_name = nvme_bdev->disk.name;

+33 −33
Original line number Diff line number Diff line
@@ -1516,7 +1516,7 @@ test_pending_reset(void)
	nvme_ctrlr = nvme_ctrlr_get_by_name("nvme0");
	SPDK_CU_ASSERT_FATAL(nvme_ctrlr != NULL);

	bdev = nvme_ctrlr->namespaces[0]->bdev;
	bdev = nvme_ctrlr_get_ns(nvme_ctrlr, 1)->bdev;
	SPDK_CU_ASSERT_FATAL(bdev != NULL);

	ch1 = spdk_get_io_channel(bdev);
@@ -1689,7 +1689,7 @@ test_attach_ctrlr(void)
	CU_ASSERT(attached_names[0] != NULL && strcmp(attached_names[0], "nvme0n1") == 0);
	attached_names[0] = NULL;

	nbdev = nvme_ctrlr->namespaces[0]->bdev;
	nbdev = nvme_ctrlr_get_ns(nvme_ctrlr, 1)->bdev;
	SPDK_CU_ASSERT_FATAL(nbdev != NULL);
	CU_ASSERT(bdev_nvme_get_ctrlr(&nbdev->disk) == ctrlr);

@@ -1834,12 +1834,12 @@ test_aer_cb(void)
	SPDK_CU_ASSERT_FATAL(nvme_ctrlr != NULL);

	CU_ASSERT(nvme_ctrlr->num_ns == 4);
	CU_ASSERT(nvme_ctrlr->namespaces[0] == NULL);
	CU_ASSERT(nvme_ctrlr->namespaces[1] != NULL);
	CU_ASSERT(nvme_ctrlr->namespaces[2] != NULL);
	CU_ASSERT(nvme_ctrlr->namespaces[3] != NULL);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 1) == NULL);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 2) != NULL);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 3) != NULL);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 4) != NULL);

	bdev = nvme_ctrlr->namespaces[3]->bdev;
	bdev = nvme_ctrlr_get_ns(nvme_ctrlr, 4)->bdev;
	SPDK_CU_ASSERT_FATAL(bdev != NULL);
	CU_ASSERT(bdev->disk.blockcnt == 1024);

@@ -1856,10 +1856,10 @@ test_aer_cb(void)

	aer_cb(nvme_ctrlr, &cpl);

	CU_ASSERT(nvme_ctrlr->namespaces[0] != NULL);
	CU_ASSERT(nvme_ctrlr->namespaces[1] != NULL);
	CU_ASSERT(nvme_ctrlr->namespaces[2] == NULL);
	CU_ASSERT(nvme_ctrlr->namespaces[3] != NULL);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 1) != NULL);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 2) != NULL);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 3) == NULL);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 4) != NULL);
	CU_ASSERT(bdev->disk.blockcnt == 2048);

	/* Change ANA state of active namespaces. */
@@ -1876,9 +1876,9 @@ test_aer_cb(void)
	spdk_delay_us(10000);
	poll_threads();

	CU_ASSERT(nvme_ctrlr->namespaces[0]->ana_state == SPDK_NVME_ANA_NON_OPTIMIZED_STATE);
	CU_ASSERT(nvme_ctrlr->namespaces[1]->ana_state == SPDK_NVME_ANA_INACCESSIBLE_STATE);
	CU_ASSERT(nvme_ctrlr->namespaces[3]->ana_state == SPDK_NVME_ANA_CHANGE_STATE);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 1)->ana_state == SPDK_NVME_ANA_NON_OPTIMIZED_STATE);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 2)->ana_state == SPDK_NVME_ANA_INACCESSIBLE_STATE);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 4)->ana_state == SPDK_NVME_ANA_CHANGE_STATE);

	rc = bdev_nvme_delete("nvme0", NULL);
	CU_ASSERT(rc == 0);
@@ -2027,7 +2027,7 @@ test_submit_nvme_cmd(void)
	nvme_ctrlr = nvme_ctrlr_get_by_name("nvme0");
	SPDK_CU_ASSERT_FATAL(nvme_ctrlr != NULL);

	bdev = nvme_ctrlr->namespaces[0]->bdev;
	bdev = nvme_ctrlr_get_ns(nvme_ctrlr, 1)->bdev;
	SPDK_CU_ASSERT_FATAL(bdev != NULL);

	set_thread(0);
@@ -2279,7 +2279,7 @@ test_abort(void)
	nvme_ctrlr = nvme_ctrlr_get_by_name("nvme0");
	SPDK_CU_ASSERT_FATAL(nvme_ctrlr != NULL);

	bdev = nvme_ctrlr->namespaces[0]->bdev;
	bdev = nvme_ctrlr_get_ns(nvme_ctrlr, 1)->bdev;
	SPDK_CU_ASSERT_FATAL(bdev != NULL);

	write_io = ut_alloc_bdev_io(SPDK_BDEV_IO_TYPE_WRITE, bdev, NULL);
@@ -2492,13 +2492,13 @@ test_bdev_unregister(void)
	nvme_ctrlr = nvme_ctrlr_get_by_name("nvme0");
	SPDK_CU_ASSERT_FATAL(nvme_ctrlr != NULL);

	nvme_ns1 = nvme_ctrlr->namespaces[0];
	nvme_ns1 = nvme_ctrlr_get_ns(nvme_ctrlr, 1);
	SPDK_CU_ASSERT_FATAL(nvme_ns1 != NULL);

	bdev1 = nvme_ns1->bdev;
	SPDK_CU_ASSERT_FATAL(bdev1 != NULL);

	nvme_ns2 = nvme_ctrlr->namespaces[1];
	nvme_ns2 = nvme_ctrlr_get_ns(nvme_ctrlr, 2);
	SPDK_CU_ASSERT_FATAL(nvme_ns2 != NULL);

	bdev2 = nvme_ns2->bdev;
@@ -2611,21 +2611,21 @@ test_init_ana_log_page(void)
	SPDK_CU_ASSERT_FATAL(nvme_ctrlr != NULL);

	CU_ASSERT(nvme_ctrlr->num_ns == 5);
	CU_ASSERT(nvme_ctrlr->namespaces[0] != NULL);
	CU_ASSERT(nvme_ctrlr->namespaces[1] != NULL);
	CU_ASSERT(nvme_ctrlr->namespaces[2] != NULL);
	CU_ASSERT(nvme_ctrlr->namespaces[3] != NULL);
	CU_ASSERT(nvme_ctrlr->namespaces[4] != NULL);
	CU_ASSERT(nvme_ctrlr->namespaces[0]->ana_state == SPDK_NVME_ANA_OPTIMIZED_STATE);
	CU_ASSERT(nvme_ctrlr->namespaces[1]->ana_state == SPDK_NVME_ANA_NON_OPTIMIZED_STATE);
	CU_ASSERT(nvme_ctrlr->namespaces[2]->ana_state == SPDK_NVME_ANA_INACCESSIBLE_STATE);
	CU_ASSERT(nvme_ctrlr->namespaces[3]->ana_state == SPDK_NVME_ANA_PERSISTENT_LOSS_STATE);
	CU_ASSERT(nvme_ctrlr->namespaces[4]->ana_state == SPDK_NVME_ANA_CHANGE_STATE);
	CU_ASSERT(nvme_ctrlr->namespaces[0]->bdev != NULL);
	CU_ASSERT(nvme_ctrlr->namespaces[1]->bdev != NULL);
	CU_ASSERT(nvme_ctrlr->namespaces[2]->bdev != NULL);
	CU_ASSERT(nvme_ctrlr->namespaces[3]->bdev != NULL);
	CU_ASSERT(nvme_ctrlr->namespaces[4]->bdev != NULL);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 1) != NULL);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 2) != NULL);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 3) != NULL);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 4) != NULL);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 5) != NULL);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 1)->ana_state == SPDK_NVME_ANA_OPTIMIZED_STATE);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 2)->ana_state == SPDK_NVME_ANA_NON_OPTIMIZED_STATE);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 3)->ana_state == SPDK_NVME_ANA_INACCESSIBLE_STATE);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 4)->ana_state == SPDK_NVME_ANA_PERSISTENT_LOSS_STATE);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 5)->ana_state == SPDK_NVME_ANA_CHANGE_STATE);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 1)->bdev != NULL);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 2)->bdev != NULL);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 3)->bdev != NULL);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 4)->bdev != NULL);
	CU_ASSERT(nvme_ctrlr_get_ns(nvme_ctrlr, 5)->bdev != NULL);

	rc = bdev_nvme_delete("nvme0", NULL);
	CU_ASSERT(rc == 0);