bdev: Add bdev resize function
Add api and unit test functions for change number of blocks for provided block device. Change-Id: I55d67c99375cb88bdaa79ce1a36d4298223beddc Signed-off-by: Slawomir Mrozowicz <slawomirx.mrozowicz@intel.com> Reviewed-on: https://review.gerrithub.io/390802 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
4ab8589ba3
commit
d4822a7db5
@ -487,6 +487,18 @@ void spdk_bdev_io_complete_scsi_status(struct spdk_bdev_io *bdev_io, enum spdk_s
|
||||
*/
|
||||
struct spdk_thread *spdk_bdev_io_get_thread(struct spdk_bdev_io *bdev_io);
|
||||
|
||||
/**
|
||||
* Resize for a bdev.
|
||||
*
|
||||
* Change number of blocks for provided block device.
|
||||
* It can only be called on a registered bdev.
|
||||
*
|
||||
* \param bdev Block device to change.
|
||||
* \param size New size of bdev.
|
||||
* \return 0 on success, negated errno on failure.
|
||||
*/
|
||||
int spdk_bdev_notify_blockcnt_change(struct spdk_bdev *bdev, uint64_t size);
|
||||
|
||||
void spdk_scsi_nvme_translate(const struct spdk_bdev_io *bdev_io,
|
||||
int *sc, int *sk, int *asc, int *ascq);
|
||||
|
||||
|
@ -1124,6 +1124,27 @@ spdk_bdev_has_write_cache(const struct spdk_bdev *bdev)
|
||||
return bdev->write_cache;
|
||||
}
|
||||
|
||||
int
|
||||
spdk_bdev_notify_blockcnt_change(struct spdk_bdev *bdev, uint64_t size)
|
||||
{
|
||||
int ret;
|
||||
|
||||
pthread_mutex_lock(&bdev->mutex);
|
||||
|
||||
/* bdev has open descriptors */
|
||||
if (!TAILQ_EMPTY(&bdev->open_descs) &&
|
||||
bdev->blockcnt > size) {
|
||||
ret = -EBUSY;
|
||||
} else {
|
||||
bdev->blockcnt = size;
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(&bdev->mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert I/O offset and length from bytes to blocks.
|
||||
*
|
||||
|
@ -791,7 +791,10 @@ vbdev_lvol_resize(char *name, size_t sz,
|
||||
rc = spdk_lvol_resize(lvol, sz, _vbdev_lvol_resize_cb, req);
|
||||
|
||||
if (rc == 0) {
|
||||
bdev->blockcnt = sz * cluster_size / bdev->blocklen;
|
||||
rc = spdk_bdev_notify_blockcnt_change(bdev, sz * cluster_size / bdev->blocklen);
|
||||
if (rc != 0) {
|
||||
SPDK_ERRLOG("Could not change num blocks for bdev_lvol.\n");
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
|
@ -286,6 +286,36 @@ bytes_to_blocks_test(void)
|
||||
CU_ASSERT(spdk_bdev_bytes_to_blocks(&bdev, 512, &offset_blocks, 3, &num_blocks) != 0);
|
||||
}
|
||||
|
||||
static void
|
||||
num_blocks_test(void)
|
||||
{
|
||||
struct spdk_bdev bdev;
|
||||
struct spdk_bdev_desc *desc;
|
||||
|
||||
memset(&bdev, 0, sizeof(bdev));
|
||||
bdev.name = "num_blocks";
|
||||
bdev.fn_table = &fn_table;
|
||||
bdev.module = SPDK_GET_BDEV_MODULE(bdev_ut);
|
||||
spdk_bdev_register(&bdev);
|
||||
spdk_bdev_notify_blockcnt_change(&bdev, 50);
|
||||
|
||||
/* Growing block number */
|
||||
CU_ASSERT(spdk_bdev_notify_blockcnt_change(&bdev, 70) == 0);
|
||||
/* Shrinking block number */
|
||||
CU_ASSERT(spdk_bdev_notify_blockcnt_change(&bdev, 30) == 0);
|
||||
|
||||
/* In case bdev opened */
|
||||
spdk_bdev_open(&bdev, false, NULL, NULL, &desc);
|
||||
|
||||
/* Growing block number */
|
||||
CU_ASSERT(spdk_bdev_notify_blockcnt_change(&bdev, 80) == 0);
|
||||
/* Shrinking block number */
|
||||
CU_ASSERT(spdk_bdev_notify_blockcnt_change(&bdev, 20) != 0);
|
||||
|
||||
spdk_bdev_close(desc);
|
||||
spdk_bdev_unregister(&bdev, NULL, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
io_valid_test(void)
|
||||
{
|
||||
@ -294,7 +324,7 @@ io_valid_test(void)
|
||||
memset(&bdev, 0, sizeof(bdev));
|
||||
|
||||
bdev.blocklen = 512;
|
||||
bdev.blockcnt = 100;
|
||||
spdk_bdev_notify_blockcnt_change(&bdev, 100);
|
||||
|
||||
/* All parameters valid */
|
||||
CU_ASSERT(spdk_bdev_io_valid_blocks(&bdev, 1, 2) == true);
|
||||
@ -451,6 +481,7 @@ main(int argc, char **argv)
|
||||
|
||||
if (
|
||||
CU_add_test(suite, "bytes_to_blocks_test", bytes_to_blocks_test) == NULL ||
|
||||
CU_add_test(suite, "num_blocks_test", num_blocks_test) == NULL ||
|
||||
CU_add_test(suite, "io_valid", io_valid_test) == NULL ||
|
||||
CU_add_test(suite, "open_write", open_write_test) == NULL ||
|
||||
CU_add_test(suite, "part", part_test) == NULL ||
|
||||
|
@ -280,6 +280,13 @@ spdk_bdev_module_finish_done(void)
|
||||
{
|
||||
}
|
||||
|
||||
int
|
||||
spdk_bdev_notify_blockcnt_change(struct spdk_bdev *bdev, uint64_t size)
|
||||
{
|
||||
bdev->blockcnt = size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
ut_bdev_pmem_destruct(struct spdk_bdev *bdev)
|
||||
{
|
||||
|
@ -242,6 +242,13 @@ spdk_lvol_resize(struct spdk_lvol *lvol, size_t sz, spdk_lvol_op_complete cb_fn
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
spdk_bdev_notify_blockcnt_change(struct spdk_bdev *bdev, uint64_t size)
|
||||
{
|
||||
bdev->blockcnt = size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64_t
|
||||
spdk_bs_get_cluster_size(struct spdk_blob_store *bs)
|
||||
{
|
||||
|
@ -203,6 +203,13 @@ spdk_bs_get_page_size(struct spdk_blob_store *bs)
|
||||
return BS_PAGE_SIZE;
|
||||
}
|
||||
|
||||
int
|
||||
spdk_bdev_notify_blockcnt_change(struct spdk_bdev *bdev, uint64_t size)
|
||||
{
|
||||
bdev->blockcnt = size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
init_dev(struct lvol_ut_bs_dev *dev)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user