Commit b87080ef authored by Jim Harris's avatar Jim Harris Committed by Tomasz Zawadzki
Browse files

bdev: add lba_range and overlapping checks



This will be used by upcoming patches for implementing
LBA range locks.

Signed-off-by: default avatarJim Harris <james.r.harris@intel.com>
Change-Id: Ifa4ad8dcc0d09ccf20d35f010fcae19dcc17abc9

Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/478224


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarPaul Luse <paul.e.luse@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarMaciej Szwed <maciej.szwed@intel.com>
parent 9e118ade
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -124,6 +124,12 @@ static struct spdk_bdev_mgr g_bdev_mgr = {
	.mutex = PTHREAD_MUTEX_INITIALIZER,
};

struct lba_range {
	uint64_t			offset;
	uint64_t			length;
	struct spdk_bdev_channel	*owner_ch;
	TAILQ_ENTRY(lba_range)		tailq;
};

static struct spdk_bdev_opts	g_bdev_opts = {
	.bdev_io_pool_size = SPDK_BDEV_IO_POOL_SIZE,
@@ -1894,6 +1900,27 @@ _bdev_io_submit(void *ctx)
	bdev_io->internal.in_submit_request = false;
}

bool
bdev_lba_range_overlapped(struct lba_range *range1, struct lba_range *range2);

bool
bdev_lba_range_overlapped(struct lba_range *range1, struct lba_range *range2)
{
	if (range1->length == 0 || range2->length == 0) {
		return false;
	}

	if (range1->offset + range1->length <= range2->offset) {
		return false;
	}

	if (range2->offset + range2->length <= range1->offset) {
		return false;
	}

	return true;
}

void
bdev_io_submit(struct spdk_bdev_io *bdev_io)
{
+47 −1
Original line number Diff line number Diff line
@@ -2541,6 +2541,51 @@ bdev_set_io_timeout(void)
	poll_threads();
}

static void
lba_range_overlap(void)
{
	struct lba_range r1, r2;

	r1.offset = 100;
	r1.length = 50;

	r2.offset = 0;
	r2.length = 1;
	CU_ASSERT(!bdev_lba_range_overlapped(&r1, &r2));

	r2.offset = 0;
	r2.length = 100;
	CU_ASSERT(!bdev_lba_range_overlapped(&r1, &r2));

	r2.offset = 0;
	r2.length = 110;
	CU_ASSERT(bdev_lba_range_overlapped(&r1, &r2));

	r2.offset = 100;
	r2.length = 10;
	CU_ASSERT(bdev_lba_range_overlapped(&r1, &r2));

	r2.offset = 110;
	r2.length = 20;
	CU_ASSERT(bdev_lba_range_overlapped(&r1, &r2));

	r2.offset = 140;
	r2.length = 150;
	CU_ASSERT(bdev_lba_range_overlapped(&r1, &r2));

	r2.offset = 130;
	r2.length = 200;
	CU_ASSERT(bdev_lba_range_overlapped(&r1, &r2));

	r2.offset = 150;
	r2.length = 100;
	CU_ASSERT(!bdev_lba_range_overlapped(&r1, &r2));

	r2.offset = 110;
	r2.length = 0;
	CU_ASSERT(!bdev_lba_range_overlapped(&r1, &r2));
}

int
main(int argc, char **argv)
{
@@ -2576,7 +2621,8 @@ main(int argc, char **argv)
		CU_add_test(suite, "bdev_open_while_hotremove", bdev_open_while_hotremove) == NULL ||
		CU_add_test(suite, "bdev_close_while_hotremove", bdev_close_while_hotremove) == NULL ||
		CU_add_test(suite, "bdev_open_ext", bdev_open_ext) == NULL ||
		CU_add_test(suite, "bdev_set_io_timeout", bdev_set_io_timeout) == NULL
		CU_add_test(suite, "bdev_set_io_timeout", bdev_set_io_timeout) == NULL ||
		CU_add_test(suite, "lba_range_overlap", lba_range_overlap) == NULL
	) {
		CU_cleanup_registry();
		return CU_get_error();