bdev/passthru: Pass-through metadata and DIF setting of base bdev
Allow I/O requests using metadata and DIF if base bdev supports them. Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Change-Id: Ie1b4b301a3d72d3fbd6e459ee2ab7d1a85425162 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/460394 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Changpeng Liu <changpeng.liu@intel.com> Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
This commit is contained in:
parent
c72e3bfe5b
commit
bcfb2b2b9c
@ -224,10 +224,20 @@ pt_read_get_buf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io, boo
|
||||
return;
|
||||
}
|
||||
|
||||
rc = spdk_bdev_readv_blocks(pt_node->base_desc, pt_ch->base_ch, bdev_io->u.bdev.iovs,
|
||||
bdev_io->u.bdev.iovcnt, bdev_io->u.bdev.offset_blocks,
|
||||
bdev_io->u.bdev.num_blocks, _pt_complete_io,
|
||||
bdev_io);
|
||||
if (bdev_io->u.bdev.md_buf == NULL) {
|
||||
rc = spdk_bdev_readv_blocks(pt_node->base_desc, pt_ch->base_ch, bdev_io->u.bdev.iovs,
|
||||
bdev_io->u.bdev.iovcnt, bdev_io->u.bdev.offset_blocks,
|
||||
bdev_io->u.bdev.num_blocks, _pt_complete_io,
|
||||
bdev_io);
|
||||
} else {
|
||||
rc = spdk_bdev_readv_blocks_with_md(pt_node->base_desc, pt_ch->base_ch,
|
||||
bdev_io->u.bdev.iovs, bdev_io->u.bdev.iovcnt,
|
||||
bdev_io->u.bdev.md_buf,
|
||||
bdev_io->u.bdev.offset_blocks,
|
||||
bdev_io->u.bdev.num_blocks,
|
||||
_pt_complete_io, bdev_io);
|
||||
}
|
||||
|
||||
if (rc != 0) {
|
||||
if (rc == -ENOMEM) {
|
||||
SPDK_ERRLOG("No memory, start to queue io for passthru.\n");
|
||||
@ -264,10 +274,19 @@ vbdev_passthru_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *b
|
||||
bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen);
|
||||
break;
|
||||
case SPDK_BDEV_IO_TYPE_WRITE:
|
||||
rc = spdk_bdev_writev_blocks(pt_node->base_desc, pt_ch->base_ch, bdev_io->u.bdev.iovs,
|
||||
bdev_io->u.bdev.iovcnt, bdev_io->u.bdev.offset_blocks,
|
||||
bdev_io->u.bdev.num_blocks, _pt_complete_io,
|
||||
bdev_io);
|
||||
if (bdev_io->u.bdev.md_buf == NULL) {
|
||||
rc = spdk_bdev_writev_blocks(pt_node->base_desc, pt_ch->base_ch, bdev_io->u.bdev.iovs,
|
||||
bdev_io->u.bdev.iovcnt, bdev_io->u.bdev.offset_blocks,
|
||||
bdev_io->u.bdev.num_blocks, _pt_complete_io,
|
||||
bdev_io);
|
||||
} else {
|
||||
rc = spdk_bdev_writev_blocks_with_md(pt_node->base_desc, pt_ch->base_ch,
|
||||
bdev_io->u.bdev.iovs, bdev_io->u.bdev.iovcnt,
|
||||
bdev_io->u.bdev.md_buf,
|
||||
bdev_io->u.bdev.offset_blocks,
|
||||
bdev_io->u.bdev.num_blocks,
|
||||
_pt_complete_io, bdev_io);
|
||||
}
|
||||
break;
|
||||
case SPDK_BDEV_IO_TYPE_WRITE_ZEROES:
|
||||
rc = spdk_bdev_write_zeroes_blocks(pt_node->base_desc, pt_ch->base_ch,
|
||||
@ -605,6 +624,12 @@ vbdev_passthru_register(struct spdk_bdev *bdev)
|
||||
pt_node->pt_bdev.blocklen = bdev->blocklen;
|
||||
pt_node->pt_bdev.blockcnt = bdev->blockcnt;
|
||||
|
||||
pt_node->pt_bdev.md_interleave = bdev->md_interleave;
|
||||
pt_node->pt_bdev.md_len = bdev->md_len;
|
||||
pt_node->pt_bdev.dif_type = bdev->dif_type;
|
||||
pt_node->pt_bdev.dif_is_head_of_md = bdev->dif_is_head_of_md;
|
||||
pt_node->pt_bdev.dif_check_flags = bdev->dif_check_flags;
|
||||
|
||||
/* This is the context that is passed to us when the bdev
|
||||
* layer calls in so we'll save our pt_bdev node here.
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user