diff --git a/module/bdev/gpt/vbdev_gpt.c b/module/bdev/gpt/vbdev_gpt.c index c10c85aa3..4bcbeced3 100644 --- a/module/bdev/gpt/vbdev_gpt.c +++ b/module/bdev/gpt/vbdev_gpt.c @@ -110,11 +110,14 @@ gpt_base_bdev_hotremove_cb(void *_part_base) static int vbdev_gpt_destruct(void *ctx); static void vbdev_gpt_submit_request(struct spdk_io_channel *_ch, struct spdk_bdev_io *bdev_io); static int vbdev_gpt_dump_info_json(void *ctx, struct spdk_json_write_ctx *w); +static int vbdev_gpt_get_memory_domains(void *ctx, struct spdk_memory_domain **domains, + int array_size); static struct spdk_bdev_fn_table vbdev_gpt_fn_table = { .destruct = vbdev_gpt_destruct, .submit_request = vbdev_gpt_submit_request, .dump_info_json = vbdev_gpt_dump_info_json, + .get_memory_domains = vbdev_gpt_get_memory_domains, }; static struct gpt_base * @@ -300,6 +303,22 @@ vbdev_gpt_dump_info_json(void *ctx, struct spdk_json_write_ctx *w) return 0; } +static int +vbdev_gpt_get_memory_domains(void *ctx, struct spdk_memory_domain **domains, int array_size) +{ + struct gpt_disk *gpt_disk = SPDK_CONTAINEROF(ctx, struct gpt_disk, part); + struct spdk_bdev_part_base *part_base = spdk_bdev_part_get_base(&gpt_disk->part); + struct spdk_bdev *part_base_bdev = spdk_bdev_part_base_get_bdev(part_base); + + if (part_base_bdev->dif_check_flags & SPDK_DIF_FLAGS_REFTAG_CHECK) { + /* bdev_part remaps reftag and touches metadata buffer, that means it can't support memory domains + * if dif is enabled */ + return 0; + } + + return spdk_bdev_get_memory_domains(part_base_bdev, domains, array_size); +} + static int vbdev_gpt_create_bdevs(struct gpt_base *gpt_base) {