diff --git a/include/spdk_internal/lvolstore.h b/include/spdk_internal/lvolstore.h index 37c0ce8b0..9db4b2c95 100644 --- a/include/spdk_internal/lvolstore.h +++ b/include/spdk_internal/lvolstore.h @@ -73,6 +73,7 @@ struct spdk_lvol_store { int lvols_opened; TAILQ_HEAD(, spdk_lvol) lvols; TAILQ_HEAD(, spdk_lvol) pending_lvols; + TAILQ_HEAD(, spdk_lvol) retry_open_lvols; bool on_list; TAILQ_ENTRY(spdk_lvol_store) link; char name[SPDK_LVS_NAME_MAX]; diff --git a/lib/lvol/lvol.c b/lib/lvol/lvol.c index aee5d1211..987be639d 100644 --- a/lib/lvol/lvol.c +++ b/lib/lvol/lvol.c @@ -351,6 +351,7 @@ lvs_load_cb(void *cb_arg, struct spdk_blob_store *bs, int lvolerrno) lvs->bs_dev = req->bs_dev; TAILQ_INIT(&lvs->lvols); TAILQ_INIT(&lvs->pending_lvols); + TAILQ_INIT(&lvs->retry_open_lvols); req->lvol_store = lvs; @@ -517,6 +518,7 @@ lvs_init_cb(void *cb_arg, struct spdk_blob_store *bs, int lvserrno) lvs->blobstore = bs; TAILQ_INIT(&lvs->lvols); TAILQ_INIT(&lvs->pending_lvols); + TAILQ_INIT(&lvs->retry_open_lvols); SPDK_INFOLOG(lvol, "Lvol store initialized\n"); diff --git a/module/bdev/lvol/vbdev_lvol.c b/module/bdev/lvol/vbdev_lvol.c index 02736015a..2a31179a8 100644 --- a/module/bdev/lvol/vbdev_lvol.c +++ b/module/bdev/lvol/vbdev_lvol.c @@ -1340,8 +1340,12 @@ _vbdev_lvs_examine_finish(void *cb_arg, struct spdk_lvol *lvol, int lvolerrno) struct spdk_lvol_store *lvs = req->lvol_store; if (lvolerrno != 0) { - SPDK_ERRLOG("Error opening lvol %s\n", lvol->unique_id); TAILQ_REMOVE(&lvs->lvols, lvol, link); + if (lvolerrno == -ENOMEM) { + TAILQ_INSERT_TAIL(&lvs->retry_open_lvols, lvol, link); + return; + } + SPDK_ERRLOG("Error opening lvol %s\n", lvol->unique_id); lvs->lvol_count--; free(lvol); goto end; @@ -1357,6 +1361,13 @@ _vbdev_lvs_examine_finish(void *cb_arg, struct spdk_lvol *lvol, int lvolerrno) SPDK_INFOLOG(vbdev_lvol, "Opening lvol %s succeeded\n", lvol->unique_id); end: + if (!TAILQ_EMPTY(&lvs->retry_open_lvols)) { + lvol = TAILQ_FIRST(&lvs->retry_open_lvols); + TAILQ_REMOVE(&lvs->retry_open_lvols, lvol, link); + TAILQ_INSERT_HEAD(&lvs->lvols, lvol, link); + spdk_lvol_open(lvol, _vbdev_lvs_examine_finish, req); + return; + } if (lvs->lvols_opened >= lvs->lvol_count) { SPDK_INFOLOG(vbdev_lvol, "Opening lvols finished\n"); _vbdev_lvs_examine_done(req, 0);