Commit d4822a7d authored by Slawomir Mrozowicz's avatar Slawomir Mrozowicz Committed by Jim Harris
Browse files

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: default avatarSlawomir Mrozowicz <slawomirx.mrozowicz@intel.com>
Reviewed-on: https://review.gerrithub.io/390802


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 4ab8589b
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -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);

+21 −0
Original line number Diff line number Diff line
@@ -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.
 *
+4 −1
Original line number Diff line number Diff line
@@ -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;
+32 −1
Original line number Diff line number Diff line
@@ -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 ||
+7 −0
Original line number Diff line number Diff line
@@ -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)
{
Loading