diff --git a/lib/bdev/split/vbdev_split.c b/lib/bdev/split/vbdev_split.c index 663eebdb2..031bb8277 100644 --- a/lib/bdev/split/vbdev_split.c +++ b/lib/bdev/split/vbdev_split.c @@ -485,4 +485,18 @@ spdk_vbdev_split_destruct(const char *base_bdev_name) return 0; } +struct spdk_bdev_part_base * +spdk_vbdev_split_get_part_base(struct spdk_bdev *bdev) +{ + struct spdk_vbdev_split_config *cfg; + + cfg = vbdev_split_config_find_by_base_name(spdk_bdev_get_name(bdev)); + + if (cfg == NULL) { + return NULL; + } + + return cfg->split_base; +} + SPDK_LOG_REGISTER_COMPONENT("vbdev_split", SPDK_LOG_VBDEV_SPLIT) diff --git a/lib/bdev/split/vbdev_split.h b/lib/bdev/split/vbdev_split.h index 74ea062cf..d10b5856b 100644 --- a/lib/bdev/split/vbdev_split.h +++ b/lib/bdev/split/vbdev_split.h @@ -56,4 +56,13 @@ int create_vbdev_split(const char *base_bdev_name, unsigned split_count, uint64_ */ int spdk_vbdev_split_destruct(const char *base_bdev_name); +/** + * Get the spdk_bdev_part_base associated with the given split base_bdev. + * + * \param base_bdev Bdev to get the part_base from + * \return pointer to the associated spdk_bdev_part_base + * \return NULL if the base_bdev is not being split by the split module + */ +struct spdk_bdev_part_base *spdk_vbdev_split_get_part_base(struct spdk_bdev *base_bdev); + #endif // SPDK_VBDEV_SPLIT_H diff --git a/lib/bdev/split/vbdev_split_rpc.c b/lib/bdev/split/vbdev_split_rpc.c index 452e58f22..fe70346f8 100644 --- a/lib/bdev/split/vbdev_split_rpc.c +++ b/lib/bdev/split/vbdev_split_rpc.c @@ -57,7 +57,6 @@ spdk_rpc_construct_split_vbdev(struct spdk_jsonrpc_request *request, struct rpc_construct_split req = {}; struct spdk_json_write_ctx *w; struct spdk_bdev *base_bdev; - size_t i; int rc; if (spdk_json_decode_object(params, rpc_construct_split_decoders, @@ -85,8 +84,19 @@ spdk_rpc_construct_split_vbdev(struct spdk_jsonrpc_request *request, base_bdev = spdk_bdev_get_by_name(req.base_bdev); if (base_bdev != NULL) { - for (i = 0; i < base_bdev->vbdevs_cnt; i++) { - spdk_json_write_string(w, spdk_bdev_get_name(base_bdev->vbdevs[i])); + struct spdk_bdev_part_base *split_base; + struct bdev_part_tailq *split_base_tailq; + struct spdk_bdev_part *split_part; + struct spdk_bdev *split_bdev; + + split_base = spdk_vbdev_split_get_part_base(base_bdev); + + assert(split_base != NULL); + + split_base_tailq = spdk_bdev_part_base_get_tailq(split_base); + TAILQ_FOREACH(split_part, split_base_tailq, tailq) { + split_bdev = spdk_bdev_part_get_bdev(split_part); + spdk_json_write_string(w, spdk_bdev_get_name(split_bdev)); } }