From e396d97db09e54c84c591a91e310ace98f362693 Mon Sep 17 00:00:00 2001 From: Tomasz Zawadzki Date: Wed, 22 Apr 2020 07:36:06 -0400 Subject: [PATCH] nvme/cuse: get functions for cuse ctrlr/ns names to accept a buffer This was changed to better facilitate thread safety. In next patch a lock will be held when going over the cuse devices list. Now user is expected to pass a buffer of a sufficient size that will be filled with ctrlr or ns cuse device name. Signed-off-by: Tomasz Zawadzki Change-Id: I3202ef285e427111e3595389619463fda58dbef6 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1978 Community-CI: Mellanox Build Bot Community-CI: Broadcom CI Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Ben Walker --- include/spdk/nvme.h | 19 ++++++++++++++----- lib/nvme/nvme_cuse.c | 32 ++++++++++++++++++++++++-------- module/bdev/nvme/bdev_nvme.c | 11 ++++++----- module/bdev/nvme/bdev_nvme_rpc.c | 9 +++++---- 4 files changed, 49 insertions(+), 22 deletions(-) diff --git a/include/spdk/nvme.h b/include/spdk/nvme.h index 939b8c67d..e66a8ddf0 100644 --- a/include/spdk/nvme.h +++ b/include/spdk/nvme.h @@ -3008,20 +3008,29 @@ void spdk_nvme_rdma_init_hooks(struct spdk_nvme_rdma_hooks *hooks); * Get name of cuse device associated with NVMe controller. * * \param ctrlr Opaque handle to NVMe controller. + * \param name Buffer of be filled with cuse device name. + * \param size Size of name buffer. * - * \return Pointer to the name of device. + * \return 0 on success. Negated errno on the following error conditions: + * -ENODEV: No cuse device registered for the controller. + * -ENSPC: Too small buffer size passed. Value of size pointer changed to the required length. */ -char *spdk_nvme_cuse_get_ctrlr_name(struct spdk_nvme_ctrlr *ctrlr); +int spdk_nvme_cuse_get_ctrlr_name(struct spdk_nvme_ctrlr *ctrlr, char *name, size_t *size); /** * Get name of cuse device associated with NVMe namespace. * * \param ctrlr Opaque handle to NVMe controller. - * \param nsid Namespace id. + * \param nsid Namespace id. + * \param name Buffer of be filled with cuse device name. + * \param size Size of name buffer. * - * \return Pointer to the name of device. + * \return 0 on success. Negated errno on the following error conditions: + * -ENODEV: No cuse device registered for the namespace. + * -ENSPC: Too small buffer size passed. Value of size pointer changed to the required length. */ -char *spdk_nvme_cuse_get_ns_name(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid); +int spdk_nvme_cuse_get_ns_name(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid, + char *name, size_t *size); /** * Create a character device at the path specified (Experimental) diff --git a/lib/nvme/nvme_cuse.c b/lib/nvme/nvme_cuse.c index b1084f22b..f4c13c607 100644 --- a/lib/nvme/nvme_cuse.c +++ b/lib/nvme/nvme_cuse.c @@ -960,28 +960,44 @@ spdk_nvme_cuse_unregister(struct spdk_nvme_ctrlr *ctrlr) return 0; } -char * -spdk_nvme_cuse_get_ctrlr_name(struct spdk_nvme_ctrlr *ctrlr) +int +spdk_nvme_cuse_get_ctrlr_name(struct spdk_nvme_ctrlr *ctrlr, char *name, size_t *size) { struct cuse_device *ctrlr_device; + size_t req_len; ctrlr_device = nvme_cuse_get_cuse_ctrlr_device(ctrlr); if (!ctrlr_device) { - return NULL; + return -ENODEV; } - return ctrlr_device->dev_name; + req_len = strnlen(ctrlr_device->dev_name, sizeof(ctrlr_device->dev_name)); + if (*size < req_len) { + *size = req_len; + return -ENOSPC; + } + snprintf(name, req_len + 1, "%s", ctrlr_device->dev_name); + + return 0; } -char * -spdk_nvme_cuse_get_ns_name(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid) +int +spdk_nvme_cuse_get_ns_name(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid, char *name, size_t *size) { struct cuse_device *ns_device; + size_t req_len; ns_device = nvme_cuse_get_cuse_ns_device(ctrlr, nsid); if (!ns_device) { - return NULL; + return -ENODEV; } - return ns_device->dev_name; + req_len = strnlen(ns_device->dev_name, sizeof(ns_device->dev_name)); + if (*size < req_len) { + *size = req_len; + return -ENOSPC; + } + snprintf(name, req_len + 1, "%s", ns_device->dev_name); + + return 0; } diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index 78fddfb23..6b0bf4203 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -765,12 +765,13 @@ bdev_nvme_dump_info_json(void *ctx, struct spdk_json_write_ctx *w) spdk_json_write_object_end(w); #ifdef SPDK_CONFIG_NVME_CUSE - char *cuse_device; + size_t cuse_name_size = 128; + char cuse_name[cuse_name_size]; - cuse_device = spdk_nvme_cuse_get_ns_name(nvme_bdev->nvme_bdev_ctrlr->ctrlr, - spdk_nvme_ns_get_id(ns)); - if (cuse_device) { - spdk_json_write_named_string(w, "cuse_device", cuse_device); + int rc = spdk_nvme_cuse_get_ns_name(nvme_bdev->nvme_bdev_ctrlr->ctrlr, spdk_nvme_ns_get_id(ns), + cuse_name, &cuse_name_size); + if (rc == 0) { + spdk_json_write_named_string(w, "cuse_device", cuse_name); } #endif diff --git a/module/bdev/nvme/bdev_nvme_rpc.c b/module/bdev/nvme/bdev_nvme_rpc.c index f40622c4f..ab8240962 100644 --- a/module/bdev/nvme/bdev_nvme_rpc.c +++ b/module/bdev/nvme/bdev_nvme_rpc.c @@ -355,11 +355,12 @@ spdk_rpc_dump_nvme_controller_info(struct spdk_json_write_ctx *w, spdk_json_write_named_string(w, "name", nvme_bdev_ctrlr->name); #ifdef SPDK_CONFIG_NVME_CUSE - char *cuse_device; + size_t cuse_name_size = 128; + char cuse_name[cuse_name_size]; - cuse_device = spdk_nvme_cuse_get_ctrlr_name(nvme_bdev_ctrlr->ctrlr); - if (cuse_device) { - spdk_json_write_named_string(w, "cuse_device", cuse_device); + int rc = spdk_nvme_cuse_get_ctrlr_name(nvme_bdev_ctrlr->ctrlr, cuse_name, &cuse_name_size); + if (rc == 0) { + spdk_json_write_named_string(w, "cuse_device", cuse_name); } #endif