Commit 6828ed18 authored by Mike Gerdts's avatar Mike Gerdts Committed by Ben Walker
Browse files

lvol: add spdk_lvol_is_degraded



This is mostly a wrapper around spdk_blob_is_degraded(), but it also
performs a NULL check on lvol->blob. Since an lvol without a blob cannot
perform IO, this condition returns true.

The two callers of spdk_blob_is_degraded() in vbdev_lvol.c have been
updated to use spdk_lvol_is_degraded().

Change-Id: I11dc682a26d971c8854aeab280c8199fced358c3
Signed-off-by: default avatarMike Gerdts <mgerdts@nvidia.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17896


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
parent 08650f86
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -373,6 +373,14 @@ void spdk_lvol_inflate(struct spdk_lvol *lvol, spdk_lvol_op_complete cb_fn, void
 */
void spdk_lvol_decouple_parent(struct spdk_lvol *lvol, spdk_lvol_op_complete cb_fn, void *cb_arg);

/**
 * Determine if an lvol is degraded. A degraded lvol cannot perform IO.
 *
 * \param lvol Handle to lvol
 * \return true if the lvol has no open blob or the lvol's blob is degraded, else false.
 */
bool spdk_lvol_is_degraded(const struct spdk_lvol *lvol);

#ifdef __cplusplus
}
#endif
+11 −0
Original line number Diff line number Diff line
@@ -2197,3 +2197,14 @@ spdk_lvol_get_by_names(const char *lvs_name, const char *lvol_name)
	pthread_mutex_unlock(&g_lvol_stores_mutex);
	return NULL;
}

bool
spdk_lvol_is_degraded(const struct spdk_lvol *lvol)
{
	struct spdk_blob *blob = lvol->blob;

	if (blob == NULL) {
		return true;
	}
	return spdk_blob_is_degraded(blob);
}
+1 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
	spdk_lvol_iter_immediate_clones;
	spdk_lvol_get_by_uuid;
	spdk_lvol_get_by_names;
	spdk_lvol_is_degraded;

	# internal functions
	spdk_lvol_resize;
+2 −2
Original line number Diff line number Diff line
@@ -653,7 +653,7 @@ _vbdev_lvol_destroy(struct spdk_lvol *lvol, spdk_lvol_op_complete cb_fn, void *c
	ctx->cb_fn = cb_fn;
	ctx->cb_arg = cb_arg;

	if (spdk_blob_is_degraded(lvol->blob)) {
	if (spdk_lvol_is_degraded(lvol)) {
		spdk_lvol_close(lvol, _vbdev_lvol_destroy_cb, ctx);
		return;
	}
@@ -1111,7 +1111,7 @@ _create_lvol_disk(struct spdk_lvol *lvol, bool destroy)
	unsigned char *alias;
	int rc;

	if (spdk_blob_is_degraded(lvol->blob)) {
	if (spdk_lvol_is_degraded(lvol)) {
		SPDK_NOTICELOG("lvol %s: blob is degraded: deferring bdev creation\n",
			       lvol->unique_id);
		return 0;
+5 −5
Original line number Diff line number Diff line
@@ -49,8 +49,8 @@ DEFINE_STUB(spdk_lvol_iter_immediate_clones, int,
DEFINE_STUB(spdk_lvs_esnap_missing_add, int,
	    (struct spdk_lvol_store *lvs, struct spdk_lvol *lvol, const void *esnap_id,
	     uint32_t id_len), -ENOTSUP);
DEFINE_STUB(spdk_blob_is_degraded, bool, (const struct spdk_blob *blob), false);
DEFINE_STUB(spdk_blob_get_esnap_bs_dev, struct spdk_bs_dev *, (const struct spdk_blob *blob), NULL);
DEFINE_STUB(spdk_lvol_is_degraded, bool, (const struct spdk_lvol *lvol), false);

struct spdk_blob {
	uint64_t	id;
@@ -1836,7 +1836,7 @@ ut_esnap_dev_create(void)

	/* Bdev not found */
	g_base_bdev = NULL;
	MOCK_SET(spdk_blob_is_degraded, true);
	MOCK_SET(spdk_lvol_is_degraded, true);
	rc = vbdev_lvol_esnap_dev_create(&lvs, &lvol, &blob, uuid_str, sizeof(uuid_str), &bs_dev);
	CU_ASSERT(rc == 0);
	SPDK_CU_ASSERT_FATAL(bs_dev != NULL);
@@ -1847,7 +1847,7 @@ ut_esnap_dev_create(void)
	/* TODO: This suggests we need a way to wait for a claim to be available. */
	g_base_bdev = &bdev;
	lvol_already_opened = true;
	MOCK_SET(spdk_blob_is_degraded, true);
	MOCK_SET(spdk_lvol_is_degraded, true);
	rc = vbdev_lvol_esnap_dev_create(&lvs, &lvol, &blob, uuid_str, sizeof(uuid_str), &bs_dev);
	CU_ASSERT(rc == 0);
	SPDK_CU_ASSERT_FATAL(bs_dev != NULL);
@@ -1856,7 +1856,7 @@ ut_esnap_dev_create(void)

	/* Happy path */
	lvol_already_opened = false;
	MOCK_SET(spdk_blob_is_degraded, false);
	MOCK_SET(spdk_lvol_is_degraded, false);
	rc = vbdev_lvol_esnap_dev_create(&lvs, &lvol, &blob, uuid_str, sizeof(uuid_str), &bs_dev);
	CU_ASSERT(rc == 0);
	SPDK_CU_ASSERT_FATAL(bs_dev != NULL);
@@ -1866,7 +1866,7 @@ ut_esnap_dev_create(void)
	g_base_bdev = NULL;
	lvol_already_opened = false;
	free(unterminated);
	MOCK_CLEAR(spdk_blob_is_degraded);
	MOCK_CLEAR(spdk_lvol_is_degraded);
}

static void
Loading