diff --git a/include/spdk/ftl.h b/include/spdk/ftl.h index a4a5ab6ee..47624ca03 100644 --- a/include/spdk/ftl.h +++ b/include/spdk/ftl.h @@ -143,6 +143,10 @@ struct spdk_ftl_attrs { struct spdk_bdev_desc *cache_bdev_desc; /* Allow partial recovery after dirty shutdown */ bool allow_open_bands; + /* Number of chunks per parallel unit in the underlying device (including any offline ones) */ + size_t num_chunks; + /* Number of sectors per chunk */ + size_t chunk_size; }; struct ftl_module_init_opts { @@ -220,7 +224,7 @@ void spdk_ftl_conf_init_defaults(struct spdk_ftl_conf *conf); * \param dev device * \param attr Attribute structure to fill */ -void spdk_ftl_dev_get_attrs(const struct spdk_ftl_dev *dev, struct spdk_ftl_attrs *attr); +void spdk_ftl_dev_get_attrs(const struct spdk_ftl_dev *dev, struct spdk_ftl_attrs *attr); /** * Submits a read to the specified device. diff --git a/lib/bdev/nvme/bdev_ftl.c b/lib/bdev/nvme/bdev_ftl.c index 396c83da1..4d035af94 100644 --- a/lib/bdev/nvme/bdev_ftl.c +++ b/lib/bdev/nvme/bdev_ftl.c @@ -403,12 +403,33 @@ bdev_ftl_get_io_channel(void *ctx) return spdk_get_io_channel(ftl_bdev); } +static void +_bdev_ftl_write_config_info(struct ftl_bdev *ftl_bdev, struct spdk_json_write_ctx *w) +{ + struct spdk_ftl_attrs attrs; + const char *trtype_str, *cache_bdev; + + spdk_ftl_dev_get_attrs(ftl_bdev->dev, &attrs); + + trtype_str = spdk_nvme_transport_id_trtype_str(ftl_bdev->ctrlr->trid.trtype); + if (trtype_str) { + spdk_json_write_named_string(w, "trtype", trtype_str); + } + + spdk_json_write_named_string(w, "traddr", ftl_bdev->ctrlr->trid.traddr); + spdk_json_write_named_string_fmt(w, "punits", "%d-%d", attrs.range.begin, attrs.range.end); + + if (ftl_bdev->cache_bdev_desc) { + cache_bdev = spdk_bdev_get_name(spdk_bdev_desc_get_bdev(ftl_bdev->cache_bdev_desc)); + spdk_json_write_named_string(w, "cache", cache_bdev); + } +} + static void bdev_ftl_write_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ctx *w) { struct ftl_bdev *ftl_bdev = bdev->ctxt; struct spdk_ftl_attrs attrs; - const char *trtype_str, *cache_bdev; char uuid[SPDK_UUID_STRING_LEN]; spdk_ftl_dev_get_attrs(ftl_bdev->dev, &attrs); @@ -420,34 +441,44 @@ bdev_ftl_write_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ctx *w spdk_json_write_named_object_begin(w, "params"); spdk_json_write_named_string(w, "name", ftl_bdev->bdev.name); - trtype_str = spdk_nvme_transport_id_trtype_str(ftl_bdev->ctrlr->trid.trtype); - if (trtype_str) { - spdk_json_write_named_string(w, "trtype", trtype_str); - } - - spdk_json_write_named_string(w, "traddr", ftl_bdev->ctrlr->trid.traddr); - spdk_json_write_named_string_fmt(w, "punits", "%d-%d", attrs.range.begin, attrs.range.end); + spdk_json_write_named_bool(w, "allow_open_bands", attrs.allow_open_bands); spdk_uuid_fmt_lower(uuid, sizeof(uuid), &attrs.uuid); spdk_json_write_named_string(w, "uuid", uuid); - if (ftl_bdev->cache_bdev_desc) { - cache_bdev = spdk_bdev_get_name(spdk_bdev_desc_get_bdev(ftl_bdev->cache_bdev_desc)); - spdk_json_write_named_string(w, "cache", cache_bdev); - } - - spdk_json_write_named_bool(w, "allow_open_bands", attrs.allow_open_bands); + _bdev_ftl_write_config_info(ftl_bdev, w); spdk_json_write_object_end(w); spdk_json_write_object_end(w); } +static int +bdev_ftl_dump_info_json(void *ctx, struct spdk_json_write_ctx *w) +{ + struct ftl_bdev *ftl_bdev = ctx; + struct spdk_ftl_attrs attrs; + + spdk_ftl_dev_get_attrs(ftl_bdev->dev, &attrs); + + spdk_json_write_named_object_begin(w, "ftl"); + + _bdev_ftl_write_config_info(ftl_bdev, w); + spdk_json_write_named_string_fmt(w, "num_chunks", "%zu", attrs.num_chunks); + spdk_json_write_named_string_fmt(w, "chunk_size", "%zu", attrs.chunk_size); + + /* ftl */ + spdk_json_write_object_end(w); + + return 0; +} + static const struct spdk_bdev_fn_table ftl_fn_table = { .destruct = bdev_ftl_destruct, .submit_request = bdev_ftl_submit_request, .io_type_supported = bdev_ftl_io_type_supported, .get_io_channel = bdev_ftl_get_io_channel, .write_config_json = bdev_ftl_write_config_json, + .dump_info_json = bdev_ftl_dump_info_json, }; int diff --git a/lib/ftl/ftl_core.c b/lib/ftl/ftl_core.c index aba090a9c..ca217fd4f 100644 --- a/lib/ftl/ftl_core.c +++ b/lib/ftl/ftl_core.c @@ -1644,6 +1644,8 @@ spdk_ftl_dev_get_attrs(const struct spdk_ftl_dev *dev, struct spdk_ftl_attrs *at attrs->range = dev->range; attrs->cache_bdev_desc = dev->nv_cache.bdev_desc; attrs->allow_open_bands = dev->conf.allow_open_bands; + attrs->num_chunks = dev->geo.num_chk; + attrs->chunk_size = dev->geo.clba; } static void