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);
|
||||
}
|
||||
|
||||
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
|
||||
bdev_nvme_add_trid(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr, struct spdk_nvme_transport_id *trid)
|
||||
{
|
||||
@ -1903,45 +1862,45 @@ out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
int
|
||||
bdev_nvme_remove_trid(const char *name, struct spdk_nvme_transport_id *trid)
|
||||
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 nvme_bdev_ctrlr *nvme_bdev_ctrlr;
|
||||
struct nvme_bdev_ctrlr_trid *ctrlr_trid, *tmp_trid;
|
||||
struct spdk_nvme_ctrlr_opts *user_opts = cb_ctx;
|
||||
struct nvme_bdev_ctrlr *nvme_bdev_ctrlr;
|
||||
struct nvme_async_probe_ctx *ctx;
|
||||
int rc;
|
||||
|
||||
if (name == NULL) {
|
||||
return -EINVAL;
|
||||
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_by_name(name);
|
||||
if (nvme_bdev_ctrlr == NULL) {
|
||||
SPDK_ERRLOG("Failed to find NVMe controller\n");
|
||||
return -ENODEV;
|
||||
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);
|
||||
}
|
||||
|
||||
/* 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;
|
||||
return SPDK_POLLER_BUSY;
|
||||
}
|
||||
|
||||
int
|
||||
@ -2028,6 +1987,47 @@ bdev_nvme_create(struct spdk_nvme_transport_id *trid,
|
||||
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
|
||||
bdev_nvme_delete(const char *name)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user