bdev: add lba_range and overlapping checks
This will be used by upcoming patches for implementing LBA range locks. Signed-off-by: Jim Harris <james.r.harris@intel.com> Change-Id: Ifa4ad8dcc0d09ccf20d35f010fcae19dcc17abc9 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/478224 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Paul Luse <paul.e.luse@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Maciej Szwed <maciej.szwed@intel.com>
This commit is contained in:
parent
9e118adeca
commit
b87080efa2
@ -124,6 +124,12 @@ static struct spdk_bdev_mgr g_bdev_mgr = {
|
|||||||
.mutex = PTHREAD_MUTEX_INITIALIZER,
|
.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 = {
|
static struct spdk_bdev_opts g_bdev_opts = {
|
||||||
.bdev_io_pool_size = SPDK_BDEV_IO_POOL_SIZE,
|
.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;
|
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
|
void
|
||||||
bdev_io_submit(struct spdk_bdev_io *bdev_io)
|
bdev_io_submit(struct spdk_bdev_io *bdev_io)
|
||||||
{
|
{
|
||||||
|
@ -2541,6 +2541,51 @@ bdev_set_io_timeout(void)
|
|||||||
poll_threads();
|
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
|
int
|
||||||
main(int argc, char **argv)
|
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_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_close_while_hotremove", bdev_close_while_hotremove) == NULL ||
|
||||||
CU_add_test(suite, "bdev_open_ext", bdev_open_ext) == 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();
|
CU_cleanup_registry();
|
||||||
return CU_get_error();
|
return CU_get_error();
|
||||||
|
Loading…
Reference in New Issue
Block a user