bdev/nvme: Move add_trid() up and remove_trid() down in a file
Move bdev_nvme_add_trid() up in a file to locate it before connect_attach_cb(). The next patch will change bdev_nvme_add_trid() to be called by connect_attach_cb() to merge the connect operation for failover case. bdev_nvme_add_trid() will be associated more closely with connect_attach_cb() and bdev_nvme_create(). To make it clear, move bdev_nvme_remove_trid() down before bdev_nvme_delete() too. Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Change-Id: Ia5eb491baea57d715aadc07f206b94884334efaf Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/5328 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Changpeng Liu <changpeng.liu@intel.com> Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
This commit is contained in:
parent
80c4ee0a5e
commit
317dd9f740
@ -1782,47 +1782,6 @@ nvme_ctrlr_populate_namespaces_done(struct nvme_async_probe_ctx *ctx)
|
|||||||
populate_namespaces_cb(ctx, j, 0);
|
populate_namespaces_cb(ctx, j, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
connect_attach_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid,
|
|
||||||
struct spdk_nvme_ctrlr *ctrlr, const struct spdk_nvme_ctrlr_opts *opts)
|
|
||||||
{
|
|
||||||
struct spdk_nvme_ctrlr_opts *user_opts = cb_ctx;
|
|
||||||
struct nvme_bdev_ctrlr *nvme_bdev_ctrlr;
|
|
||||||
struct nvme_async_probe_ctx *ctx;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
ctx = SPDK_CONTAINEROF(user_opts, struct nvme_async_probe_ctx, opts);
|
|
||||||
|
|
||||||
spdk_poller_unregister(&ctx->poller);
|
|
||||||
|
|
||||||
rc = nvme_bdev_ctrlr_create(ctrlr, ctx->base_name, &ctx->trid, ctx->prchk_flags);
|
|
||||||
if (rc) {
|
|
||||||
SPDK_ERRLOG("Failed to create new device\n");
|
|
||||||
populate_namespaces_cb(ctx, 0, rc);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
nvme_bdev_ctrlr = nvme_bdev_ctrlr_get(&ctx->trid);
|
|
||||||
assert(nvme_bdev_ctrlr != NULL);
|
|
||||||
|
|
||||||
nvme_ctrlr_populate_namespaces(nvme_bdev_ctrlr, ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
bdev_nvme_async_poll(void *arg)
|
|
||||||
{
|
|
||||||
struct nvme_async_probe_ctx *ctx = arg;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
rc = spdk_nvme_probe_poll_async(ctx->probe_ctx);
|
|
||||||
if (spdk_unlikely(rc != -EAGAIN && rc != 0)) {
|
|
||||||
spdk_poller_unregister(&ctx->poller);
|
|
||||||
free(ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
return SPDK_POLLER_BUSY;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
bdev_nvme_add_trid(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr, struct spdk_nvme_transport_id *trid)
|
bdev_nvme_add_trid(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr, struct spdk_nvme_transport_id *trid)
|
||||||
{
|
{
|
||||||
@ -1903,45 +1862,45 @@ out:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
static void
|
||||||
bdev_nvme_remove_trid(const char *name, struct spdk_nvme_transport_id *trid)
|
connect_attach_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid,
|
||||||
|
struct spdk_nvme_ctrlr *ctrlr, const struct spdk_nvme_ctrlr_opts *opts)
|
||||||
{
|
{
|
||||||
struct nvme_bdev_ctrlr *nvme_bdev_ctrlr;
|
struct spdk_nvme_ctrlr_opts *user_opts = cb_ctx;
|
||||||
struct nvme_bdev_ctrlr_trid *ctrlr_trid, *tmp_trid;
|
struct nvme_bdev_ctrlr *nvme_bdev_ctrlr;
|
||||||
|
struct nvme_async_probe_ctx *ctx;
|
||||||
|
int rc;
|
||||||
|
|
||||||
if (name == NULL) {
|
ctx = SPDK_CONTAINEROF(user_opts, struct nvme_async_probe_ctx, opts);
|
||||||
return -EINVAL;
|
|
||||||
|
spdk_poller_unregister(&ctx->poller);
|
||||||
|
|
||||||
|
rc = nvme_bdev_ctrlr_create(ctrlr, ctx->base_name, &ctx->trid, ctx->prchk_flags);
|
||||||
|
if (rc) {
|
||||||
|
SPDK_ERRLOG("Failed to create new device\n");
|
||||||
|
populate_namespaces_cb(ctx, 0, rc);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
nvme_bdev_ctrlr = nvme_bdev_ctrlr_get_by_name(name);
|
nvme_bdev_ctrlr = nvme_bdev_ctrlr_get(&ctx->trid);
|
||||||
if (nvme_bdev_ctrlr == NULL) {
|
assert(nvme_bdev_ctrlr != NULL);
|
||||||
SPDK_ERRLOG("Failed to find NVMe controller\n");
|
|
||||||
return -ENODEV;
|
nvme_ctrlr_populate_namespaces(nvme_bdev_ctrlr, ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
bdev_nvme_async_poll(void *arg)
|
||||||
|
{
|
||||||
|
struct nvme_async_probe_ctx *ctx = arg;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = spdk_nvme_probe_poll_async(ctx->probe_ctx);
|
||||||
|
if (spdk_unlikely(rc != -EAGAIN && rc != 0)) {
|
||||||
|
spdk_poller_unregister(&ctx->poller);
|
||||||
|
free(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* case 1: we are currently using the path to be removed. */
|
return SPDK_POLLER_BUSY;
|
||||||
if (!spdk_nvme_transport_id_compare(trid, nvme_bdev_ctrlr->connected_trid)) {
|
|
||||||
ctrlr_trid = TAILQ_FIRST(&nvme_bdev_ctrlr->trids);
|
|
||||||
assert(nvme_bdev_ctrlr->connected_trid == &ctrlr_trid->trid);
|
|
||||||
/* case 1A: the current path is the only path. */
|
|
||||||
if (!TAILQ_NEXT(ctrlr_trid, link)) {
|
|
||||||
return bdev_nvme_delete(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* case 1B: there is an alternative path. */
|
|
||||||
return bdev_nvme_failover(nvme_bdev_ctrlr, true);
|
|
||||||
}
|
|
||||||
/* case 2: We are not using the specified path. */
|
|
||||||
TAILQ_FOREACH_SAFE(ctrlr_trid, &nvme_bdev_ctrlr->trids, link, tmp_trid) {
|
|
||||||
if (!spdk_nvme_transport_id_compare(&ctrlr_trid->trid, trid)) {
|
|
||||||
TAILQ_REMOVE(&nvme_bdev_ctrlr->trids, ctrlr_trid, link);
|
|
||||||
free(ctrlr_trid);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* case 2A: The address isn't even in the registered list. */
|
|
||||||
return -ENXIO;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -2028,6 +1987,47 @@ bdev_nvme_create(struct spdk_nvme_transport_id *trid,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
bdev_nvme_remove_trid(const char *name, struct spdk_nvme_transport_id *trid)
|
||||||
|
{
|
||||||
|
struct nvme_bdev_ctrlr *nvme_bdev_ctrlr;
|
||||||
|
struct nvme_bdev_ctrlr_trid *ctrlr_trid, *tmp_trid;
|
||||||
|
|
||||||
|
if (name == NULL) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
nvme_bdev_ctrlr = nvme_bdev_ctrlr_get_by_name(name);
|
||||||
|
if (nvme_bdev_ctrlr == NULL) {
|
||||||
|
SPDK_ERRLOG("Failed to find NVMe controller\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* case 1: we are currently using the path to be removed. */
|
||||||
|
if (!spdk_nvme_transport_id_compare(trid, nvme_bdev_ctrlr->connected_trid)) {
|
||||||
|
ctrlr_trid = TAILQ_FIRST(&nvme_bdev_ctrlr->trids);
|
||||||
|
assert(nvme_bdev_ctrlr->connected_trid == &ctrlr_trid->trid);
|
||||||
|
/* case 1A: the current path is the only path. */
|
||||||
|
if (!TAILQ_NEXT(ctrlr_trid, link)) {
|
||||||
|
return bdev_nvme_delete(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* case 1B: there is an alternative path. */
|
||||||
|
return bdev_nvme_failover(nvme_bdev_ctrlr, true);
|
||||||
|
}
|
||||||
|
/* case 2: We are not using the specified path. */
|
||||||
|
TAILQ_FOREACH_SAFE(ctrlr_trid, &nvme_bdev_ctrlr->trids, link, tmp_trid) {
|
||||||
|
if (!spdk_nvme_transport_id_compare(&ctrlr_trid->trid, trid)) {
|
||||||
|
TAILQ_REMOVE(&nvme_bdev_ctrlr->trids, ctrlr_trid, link);
|
||||||
|
free(ctrlr_trid);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* case 2A: The address isn't even in the registered list. */
|
||||||
|
return -ENXIO;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
bdev_nvme_delete(const char *name)
|
bdev_nvme_delete(const char *name)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user