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,
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user