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: Mike Gerdts <mgerdts@nvidia.com> Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17896 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Community-CI: Mellanox Build Bot Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
parent
b240c2b103
commit
c9b802ca49
@ -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);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -2197,3 +2197,14 @@ spdk_lvol_get_by_names(const char *lvs_name, const char *lvol_name)
|
|||||||
pthread_mutex_unlock(&g_lvol_stores_mutex);
|
pthread_mutex_unlock(&g_lvol_stores_mutex);
|
||||||
return NULL;
|
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);
|
||||||
|
}
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
spdk_lvol_iter_immediate_clones;
|
spdk_lvol_iter_immediate_clones;
|
||||||
spdk_lvol_get_by_uuid;
|
spdk_lvol_get_by_uuid;
|
||||||
spdk_lvol_get_by_names;
|
spdk_lvol_get_by_names;
|
||||||
|
spdk_lvol_is_degraded;
|
||||||
|
|
||||||
# internal functions
|
# internal functions
|
||||||
spdk_lvol_resize;
|
spdk_lvol_resize;
|
||||||
|
@ -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_fn = cb_fn;
|
||||||
ctx->cb_arg = cb_arg;
|
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);
|
spdk_lvol_close(lvol, _vbdev_lvol_destroy_cb, ctx);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1111,7 +1111,7 @@ _create_lvol_disk(struct spdk_lvol *lvol, bool destroy)
|
|||||||
unsigned char *alias;
|
unsigned char *alias;
|
||||||
int rc;
|
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",
|
SPDK_NOTICELOG("lvol %s: blob is degraded: deferring bdev creation\n",
|
||||||
lvol->unique_id);
|
lvol->unique_id);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -49,8 +49,8 @@ DEFINE_STUB(spdk_lvol_iter_immediate_clones, int,
|
|||||||
DEFINE_STUB(spdk_lvs_esnap_missing_add, int,
|
DEFINE_STUB(spdk_lvs_esnap_missing_add, int,
|
||||||
(struct spdk_lvol_store *lvs, struct spdk_lvol *lvol, const void *esnap_id,
|
(struct spdk_lvol_store *lvs, struct spdk_lvol *lvol, const void *esnap_id,
|
||||||
uint32_t id_len), -ENOTSUP);
|
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_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 {
|
struct spdk_blob {
|
||||||
uint64_t id;
|
uint64_t id;
|
||||||
@ -1836,7 +1836,7 @@ ut_esnap_dev_create(void)
|
|||||||
|
|
||||||
/* Bdev not found */
|
/* Bdev not found */
|
||||||
g_base_bdev = NULL;
|
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);
|
rc = vbdev_lvol_esnap_dev_create(&lvs, &lvol, &blob, uuid_str, sizeof(uuid_str), &bs_dev);
|
||||||
CU_ASSERT(rc == 0);
|
CU_ASSERT(rc == 0);
|
||||||
SPDK_CU_ASSERT_FATAL(bs_dev != NULL);
|
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. */
|
/* TODO: This suggests we need a way to wait for a claim to be available. */
|
||||||
g_base_bdev = &bdev;
|
g_base_bdev = &bdev;
|
||||||
lvol_already_opened = true;
|
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);
|
rc = vbdev_lvol_esnap_dev_create(&lvs, &lvol, &blob, uuid_str, sizeof(uuid_str), &bs_dev);
|
||||||
CU_ASSERT(rc == 0);
|
CU_ASSERT(rc == 0);
|
||||||
SPDK_CU_ASSERT_FATAL(bs_dev != NULL);
|
SPDK_CU_ASSERT_FATAL(bs_dev != NULL);
|
||||||
@ -1856,7 +1856,7 @@ ut_esnap_dev_create(void)
|
|||||||
|
|
||||||
/* Happy path */
|
/* Happy path */
|
||||||
lvol_already_opened = false;
|
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);
|
rc = vbdev_lvol_esnap_dev_create(&lvs, &lvol, &blob, uuid_str, sizeof(uuid_str), &bs_dev);
|
||||||
CU_ASSERT(rc == 0);
|
CU_ASSERT(rc == 0);
|
||||||
SPDK_CU_ASSERT_FATAL(bs_dev != NULL);
|
SPDK_CU_ASSERT_FATAL(bs_dev != NULL);
|
||||||
@ -1866,7 +1866,7 @@ ut_esnap_dev_create(void)
|
|||||||
g_base_bdev = NULL;
|
g_base_bdev = NULL;
|
||||||
lvol_already_opened = false;
|
lvol_already_opened = false;
|
||||||
free(unterminated);
|
free(unterminated);
|
||||||
MOCK_CLEAR(spdk_blob_is_degraded);
|
MOCK_CLEAR(spdk_lvol_is_degraded);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -35,6 +35,7 @@ DEFINE_STUB(spdk_bdev_create_bs_dev_ro, int,
|
|||||||
(const char *bdev_name, spdk_bdev_event_cb_t event_cb, void *event_ctx,
|
(const char *bdev_name, spdk_bdev_event_cb_t event_cb, void *event_ctx,
|
||||||
struct spdk_bs_dev **bs_dev), -ENOTSUP);
|
struct spdk_bs_dev **bs_dev), -ENOTSUP);
|
||||||
DEFINE_STUB(spdk_blob_is_esnap_clone, bool, (const struct spdk_blob *blob), false);
|
DEFINE_STUB(spdk_blob_is_esnap_clone, bool, (const struct spdk_blob *blob), false);
|
||||||
|
DEFINE_STUB(spdk_blob_is_degraded, bool, (const struct spdk_blob *blob), false);
|
||||||
|
|
||||||
const char *uuid = "828d9766-ae50-11e7-bd8d-001e67edf350";
|
const char *uuid = "828d9766-ae50-11e7-bd8d-001e67edf350";
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user