From 6a72c19ee2952f388b12150e6bda716ee6465c54 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Wed, 14 Oct 2020 23:55:06 +0900 Subject: [PATCH] blob/bdev: Add an API spdk_bdev_create_bs_dev_ext() spdk_bdev_open_ext() requires the caller to use bdev_event_cb_t and bdev_event_cb_t is more extensible than bdev_remove_cb_t. Hence use bdev_event_t as an argument. spdk_bdev_open_ext() calls spdk_bdev_get_by_name() inside and spdk_bdev_create_bs_dev_ext() calls spdk_bdev_open_ext() inside. The caller needs to know if the spdk_bdev_get_by_name() succeeded. Hence spdk_bdev_create_bs_dev_ext() returns return code by return value and returns the created bs_dev by double pointer. Signed-off-by: Shuhei Matsumoto Change-Id: I1c225bfb66db036439c69c459f39c86684d8a540 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4692 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Tomasz Zawadzki Reviewed-by: Aleksey Marchuk --- CHANGELOG.md | 5 +++++ include/spdk/blob_bdev.h | 18 +++++++++++++++--- module/blob/bdev/Makefile | 2 +- module/blob/bdev/blob_bdev.c | 29 +++++++++++++++++++++++++++++ module/blob/bdev/spdk_blob_bdev.map | 1 + 5 files changed, 51 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea86b2037..73a361dae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,11 @@ A new `spdk_bdev_part_base_construct_ext` function has been added and the of bdev structure to avoid a race condition that can happen when the bdev is being removed between a call to get its structure based on a name and actually openning it. +### blobstore + +A new `spdk_bdev_create_bs_dev_ext` function has been added and `spdk_bdev_create_bs_dev_from_desc` +function has been deprecated. + ### dpdk Updated DPDK submodule to DPDK 20.08. diff --git a/include/spdk/blob_bdev.h b/include/spdk/blob_bdev.h index 1867c464c..fc2e4e7e4 100644 --- a/include/spdk/blob_bdev.h +++ b/include/spdk/blob_bdev.h @@ -50,8 +50,7 @@ struct spdk_bdev; struct spdk_bdev_module; /** - * Create a blobstore block device from a bdev. (deprecated, please use spdk_bdev_create_bs_dev_from_desc, - * together with spdk_bdev_open_ext). + * Create a blobstore block device from a bdev (deprecated, please use spdk_bdev_create_bs_dev_ext). * * \param bdev Bdev to use. * \param remove_cb Called when the block device is removed. @@ -63,7 +62,7 @@ struct spdk_bs_dev *spdk_bdev_create_bs_dev(struct spdk_bdev *bdev, spdk_bdev_re void *remove_ctx); /** - * Create a blobstore block device from the descriptor of a bdev. + * Create a blobstore block device from the descriptor of a bdev (deprecated, please use spdk_bdev_create_bs_dev_ext). * * \param desc Descriptor of a bdev. spdk_bdev_open_ext() is recommended to get the desc. * @@ -71,6 +70,19 @@ struct spdk_bs_dev *spdk_bdev_create_bs_dev(struct spdk_bdev *bdev, spdk_bdev_re */ struct spdk_bs_dev *spdk_bdev_create_bs_dev_from_desc(struct spdk_bdev_desc *desc); +/** + * Create a blobstore block device from a bdev. + * + * \param bdev_name Name of the bdev to use. + * \param event_cb Called when the bdev triggers asynchronous event. + * \param event_ctx Argument passed to function event_cb. + * \param bs_dev Output parameter for a pointer to the blobstore block device. + * + * \return 0 if operation is successful, or suitable errno value otherwise. + */ +int spdk_bdev_create_bs_dev_ext(const char *bdev_name, spdk_bdev_event_cb_t event_cb, + void *event_ctx, struct spdk_bs_dev **bs_dev); + /** * Claim the bdev module for the given blobstore. * diff --git a/module/blob/bdev/Makefile b/module/blob/bdev/Makefile index d40f6afb8..02d120d30 100644 --- a/module/blob/bdev/Makefile +++ b/module/blob/bdev/Makefile @@ -35,7 +35,7 @@ SPDK_ROOT_DIR := $(abspath $(CURDIR)/../../..) include $(SPDK_ROOT_DIR)/mk/spdk.common.mk SO_VER := 3 -SO_MINOR := 0 +SO_MINOR := 1 C_SRCS = blob_bdev.c LIBNAME = blob_bdev diff --git a/module/blob/bdev/blob_bdev.c b/module/blob/bdev/blob_bdev.c index 9a4fafaac..592b68782 100644 --- a/module/blob/bdev/blob_bdev.c +++ b/module/blob/bdev/blob_bdev.c @@ -383,3 +383,32 @@ spdk_bdev_create_bs_dev_from_desc(struct spdk_bdev_desc *desc) return &b->bs_dev; } + + +int +spdk_bdev_create_bs_dev_ext(const char *bdev_name, spdk_bdev_event_cb_t event_cb, + void *event_ctx, struct spdk_bs_dev **_bs_dev) +{ + struct blob_bdev *b; + struct spdk_bdev_desc *desc; + int rc; + + b = calloc(1, sizeof(*b)); + + if (b == NULL) { + SPDK_ERRLOG("could not allocate blob_bdev\n"); + return -ENOMEM; + } + + rc = spdk_bdev_open_ext(bdev_name, true, event_cb, event_ctx, &desc); + if (rc != 0) { + free(b); + return rc; + } + + blob_bdev_init(b, desc); + + *_bs_dev = &b->bs_dev; + + return 0; +} diff --git a/module/blob/bdev/spdk_blob_bdev.map b/module/blob/bdev/spdk_blob_bdev.map index 0149b3ab6..cc35a5a2a 100644 --- a/module/blob/bdev/spdk_blob_bdev.map +++ b/module/blob/bdev/spdk_blob_bdev.map @@ -4,6 +4,7 @@ # public functions spdk_bdev_create_bs_dev; spdk_bdev_create_bs_dev_from_desc; + spdk_bdev_create_bs_dev_ext; spdk_bs_bdev_claim; local: *;