diff --git a/lib/bdev/iscsi/bdev_iscsi.c b/lib/bdev/iscsi/bdev_iscsi.c index 54b915e7f..c084cd7ce 100644 --- a/lib/bdev/iscsi/bdev_iscsi.c +++ b/lib/bdev/iscsi/bdev_iscsi.c @@ -209,8 +209,9 @@ bdev_iscsi_io_complete(struct bdev_iscsi_io *iscsi_io, enum spdk_bdev_io_status } } +/* Common call back function for read/write/flush command */ static void -bdev_iscsi_rw_cb(struct iscsi_context *context, int status, void *_task, void *_iscsi_io) +bdev_iscsi_command_cb(struct iscsi_context *context, int status, void *_task, void *_iscsi_io) { struct scsi_task *task = _task; struct bdev_iscsi_io *iscsi_io = _iscsi_io; @@ -234,7 +235,7 @@ bdev_iscsi_readv(struct bdev_iscsi_lun *lun, struct bdev_iscsi_io *iscsi_io, iovcnt, nbytes, lba); task = iscsi_read16_task(lun->context, 0, lba, nbytes, lun->bdev.blocklen, 0, 0, 0, 0, 0, - bdev_iscsi_rw_cb, iscsi_io); + bdev_iscsi_command_cb, iscsi_io); if (task == NULL) { SPDK_ERRLOG("failed to get read16_task\n"); bdev_iscsi_io_complete(iscsi_io, SPDK_BDEV_IO_STATUS_FAILED); @@ -261,7 +262,7 @@ bdev_iscsi_writev(struct bdev_iscsi_lun *lun, struct bdev_iscsi_io *iscsi_io, iovcnt, nbytes, lba); task = iscsi_write16_task(lun->context, 0, lba, NULL, nbytes, lun->bdev.blocklen, 0, 0, 0, 0, 0, - bdev_iscsi_rw_cb, iscsi_io); + bdev_iscsi_command_cb, iscsi_io); if (task == NULL) { SPDK_ERRLOG("failed to get write16_task\n"); bdev_iscsi_io_complete(iscsi_io, SPDK_BDEV_IO_STATUS_FAILED); @@ -288,6 +289,21 @@ bdev_iscsi_destruct(void *ctx) return rc; } +static void +bdev_iscsi_flush(struct bdev_iscsi_lun *lun, struct bdev_iscsi_io *iscsi_io, uint32_t num_blocks, + int immed, uint64_t lba) +{ + struct scsi_task *task; + + task = iscsi_synchronizecache16_task(lun->context, 0, lba, + num_blocks, 0, immed, bdev_iscsi_command_cb, iscsi_io); + if (task == NULL) { + SPDK_ERRLOG("failed to get sync16_task\n"); + bdev_iscsi_io_complete(iscsi_io, SPDK_BDEV_IO_STATUS_FAILED); + return; + } +} + static int bdev_iscsi_poll(void *arg) { @@ -341,6 +357,12 @@ static void _bdev_iscsi_submit_request(void *_bdev_io) bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen, bdev_io->u.bdev.offset_blocks); break; + case SPDK_BDEV_IO_TYPE_FLUSH: + bdev_iscsi_flush(lun, iscsi_io, + bdev_io->u.bdev.num_blocks, + ISCSI_IMMEDIATE_DATA_NO, + bdev_io->u.bdev.offset_blocks); + break; default: bdev_iscsi_io_complete(iscsi_io, SPDK_BDEV_IO_STATUS_FAILED); break; @@ -368,6 +390,7 @@ bdev_iscsi_io_type_supported(void *ctx, enum spdk_bdev_io_type io_type) switch (io_type) { case SPDK_BDEV_IO_TYPE_READ: case SPDK_BDEV_IO_TYPE_WRITE: + case SPDK_BDEV_IO_TYPE_FLUSH: return true; default: