Commit 3cba062b authored by Xiaodong Liu's avatar Xiaodong Liu Committed by Changpeng Liu
Browse files

blob_bdev: add spdk_bdev_create_bs_dev_from_desc



New interface for create spdk_bs_dev from bdev desc.
This change, together with spdk_bdev_open_ext, can
remove the race condition where user gets the bdev
structure, but bdev is removed after getting that
structure and before spdk_bdev_create_bs_dev function
is called.

Change-Id: Ia80c3527ff91b45f97f44d295a5cb6d83f5ee0e4
Signed-off-by: default avatarXiaodong Liu <xiaodong.liu@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/468412


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarPaul Luse <paul.e.luse@intel.com>
parent 032a8b1c
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -24,6 +24,13 @@ asynchronous event such as bdev removal. spdk_bdev_open_ext function takes bdev
an argument instead 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_from_desc function has been added and spdk_bdev_create_bs_dev
function has been deprecated.
The new create function can cowork with spdk_bdev_open_ext function, which provides callback
function that will be called by asynchronous event such as bdev removal.

### nvme

Added `no_shn_notification` to NVMe controller initialization options, users can enable
+11 −1
Original line number Diff line number Diff line
@@ -50,7 +50,8 @@ struct spdk_bdev;
struct spdk_bdev_module;

/**
 * Create a blobstore block device from a bdev.
 * Create a blobstore block device from a bdev. (deprecated, please use spdk_bdev_create_bs_dev_from_desc,
 * together with spdk_bdev_open_ext).
 *
 * \param bdev Bdev to use.
 * \param remove_cb Called when the block device is removed.
@@ -61,6 +62,15 @@ struct spdk_bdev_module;
struct spdk_bs_dev *spdk_bdev_create_bs_dev(struct spdk_bdev *bdev, spdk_bdev_remove_cb_t remove_cb,
		void *remove_ctx);

/**
 * Create a blobstore block device from the descriptor of a bdev.
 *
 * \param desc Descriptor of a bdev. spdk_bdev_open_ext() is recommended to get the desc.
 *
 * \return a pointer to the blobstore block device on success or NULL otherwise.
 */
struct spdk_bs_dev *spdk_bdev_create_bs_dev_from_desc(struct spdk_bdev_desc *desc);

/**
 * Claim the bdev module for the given blobstore.
 *
+33 −0
Original line number Diff line number Diff line
@@ -355,3 +355,36 @@ spdk_bdev_create_bs_dev(struct spdk_bdev *bdev, spdk_bdev_remove_cb_t remove_cb,

	return &b->bs_dev;
}

struct spdk_bs_dev *
spdk_bdev_create_bs_dev_from_desc(struct spdk_bdev_desc *desc)
{
	struct blob_bdev *b;
	struct spdk_bdev *bdev;

	b = calloc(1, sizeof(*b));

	if (b == NULL) {
		SPDK_ERRLOG("could not allocate blob_bdev\n");
		return NULL;
	}

	bdev = spdk_bdev_desc_get_bdev(desc);
	assert(bdev != NULL);

	b->bdev = bdev;
	b->desc = desc;
	b->bs_dev.blockcnt = spdk_bdev_get_num_blocks(bdev);
	b->bs_dev.blocklen = spdk_bdev_get_block_size(bdev);
	b->bs_dev.create_channel = bdev_blob_create_channel;
	b->bs_dev.destroy_channel = bdev_blob_destroy_channel;
	b->bs_dev.destroy = bdev_blob_destroy;
	b->bs_dev.read = bdev_blob_read;
	b->bs_dev.write = bdev_blob_write;
	b->bs_dev.readv = bdev_blob_readv;
	b->bs_dev.writev = bdev_blob_writev;
	b->bs_dev.write_zeroes = bdev_blob_write_zeroes;
	b->bs_dev.unmap = bdev_blob_unmap;

	return &b->bs_dev;
}