bdev, rbd: Add flush support

Change-Id: I779d52b1af868c7e614faf37a50fecba65757536
Signed-off-by: Ziye Yang <ziye.yang@intel.com>
This commit is contained in:
Ziye Yang 2016-10-12 07:47:27 +08:00 committed by Daniel Verkamp
parent 9dd0f89486
commit 89b216a2a1

View File

@ -66,6 +66,7 @@ struct blockdev_rbd_pool_info {
enum blockdev_rbd_data_direction { enum blockdev_rbd_data_direction {
BLOCKDEV_RBD_READ = 0, BLOCKDEV_RBD_READ = 0,
BLOCKDEV_RBD_WRITE = 1, BLOCKDEV_RBD_WRITE = 1,
BLOCKDEV_RBD_FLUSH = 2,
}; };
struct blockdev_rbd_io { struct blockdev_rbd_io {
@ -199,6 +200,8 @@ blockdev_rbd_start_aio(rbd_image_t image, struct blockdev_rbd_io *cmd,
} else if (cmd->direction == BLOCKDEV_RBD_WRITE) { } else if (cmd->direction == BLOCKDEV_RBD_WRITE) {
ret = rbd_aio_write(image, offset, len, ret = rbd_aio_write(image, offset, len,
buf, cmd->completion); buf, cmd->completion);
} else if (cmd->direction == BLOCKDEV_RBD_FLUSH) {
ret = rbd_aio_flush(image, cmd->completion);
} }
if (ret < 0) { if (ret < 0) {
@ -251,6 +254,18 @@ blockdev_rbd_writev(struct blockdev_rbd *disk, struct spdk_io_channel *ch,
return blockdev_rbd_start_aio(rbdio_ch->image, cmd, (void *)iov->iov_base, offset, len); return blockdev_rbd_start_aio(rbdio_ch->image, cmd, (void *)iov->iov_base, offset, len);
} }
static int64_t
blockdev_rbd_flush(struct blockdev_rbd *disk, struct spdk_io_channel *ch,
struct blockdev_rbd_io *cmd, uint64_t offset, uint64_t nbytes)
{
struct blockdev_rbd_io_channel *rbdio_ch = spdk_io_channel_get_ctx(ch);
cmd->ch = (void *)rbdio_ch;
cmd->direction = BLOCKDEV_RBD_FLUSH;
return blockdev_rbd_start_aio(rbdio_ch->image, cmd, NULL, offset, nbytes);
}
static int static int
blockdev_rbd_destruct(struct spdk_bdev *bdev) blockdev_rbd_destruct(struct spdk_bdev *bdev)
{ {
@ -288,6 +303,12 @@ static int _blockdev_rbd_submit_request(struct spdk_bdev_io *bdev_io)
bdev_io->u.write.iovcnt, bdev_io->u.write.iovcnt,
bdev_io->u.write.len, bdev_io->u.write.len,
bdev_io->u.write.offset); bdev_io->u.write.offset);
case SPDK_BDEV_IO_TYPE_FLUSH:
return blockdev_rbd_flush((struct blockdev_rbd *)bdev_io->ctx,
bdev_io->ch,
(struct blockdev_rbd_io *)bdev_io->driver_ctx,
bdev_io->u.flush.offset,
bdev_io->u.flush.length);
default: default:
return -1; return -1;
} }
@ -307,6 +328,7 @@ blockdev_rbd_io_type_supported(struct spdk_bdev *bdev, enum spdk_bdev_io_type io
switch (io_type) { switch (io_type) {
case SPDK_BDEV_IO_TYPE_READ: case SPDK_BDEV_IO_TYPE_READ:
case SPDK_BDEV_IO_TYPE_WRITE: case SPDK_BDEV_IO_TYPE_WRITE:
case SPDK_BDEV_IO_TYPE_FLUSH:
return true; return true;
default: default: