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: Xiaodong Liu <xiaodong.liu@intel.com> Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/468412 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Changpeng Liu <changpeng.liu@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Paul Luse <paul.e.luse@intel.com>
This commit is contained in:
parent
032a8b1c9b
commit
3cba062b86
@ -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
|
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.
|
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
|
### nvme
|
||||||
|
|
||||||
Added `no_shn_notification` to NVMe controller initialization options, users can enable
|
Added `no_shn_notification` to NVMe controller initialization options, users can enable
|
||||||
|
@ -50,7 +50,8 @@ struct spdk_bdev;
|
|||||||
struct spdk_bdev_module;
|
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 bdev Bdev to use.
|
||||||
* \param remove_cb Called when the block device is removed.
|
* \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,
|
struct spdk_bs_dev *spdk_bdev_create_bs_dev(struct spdk_bdev *bdev, spdk_bdev_remove_cb_t remove_cb,
|
||||||
void *remove_ctx);
|
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.
|
* Claim the bdev module for the given blobstore.
|
||||||
*
|
*
|
||||||
|
@ -355,3 +355,36 @@ spdk_bdev_create_bs_dev(struct spdk_bdev *bdev, spdk_bdev_remove_cb_t remove_cb,
|
|||||||
|
|
||||||
return &b->bs_dev;
|
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;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user