bdev/iscsi: Add bdev_iscsi_flush

Change-Id: I6afb19f205be983206ce33c5c79718eb32ff5467
Signed-off-by: Chunyang Hui <Chunyang.hui@intel.com>
Reviewed-on: https://review.gerrithub.io/413715
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Chunyang Hui 2018-06-05 13:50:56 +08:00 committed by Jim Harris
parent e60e783262
commit c739083169

View File

@ -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 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 scsi_task *task = _task;
struct bdev_iscsi_io *iscsi_io = _iscsi_io; 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); iovcnt, nbytes, lba);
task = iscsi_read16_task(lun->context, 0, lba, nbytes, lun->bdev.blocklen, 0, 0, 0, 0, 0, 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) { if (task == NULL) {
SPDK_ERRLOG("failed to get read16_task\n"); SPDK_ERRLOG("failed to get read16_task\n");
bdev_iscsi_io_complete(iscsi_io, SPDK_BDEV_IO_STATUS_FAILED); 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); iovcnt, nbytes, lba);
task = iscsi_write16_task(lun->context, 0, lba, NULL, nbytes, lun->bdev.blocklen, 0, 0, 0, 0, 0, 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) { if (task == NULL) {
SPDK_ERRLOG("failed to get write16_task\n"); SPDK_ERRLOG("failed to get write16_task\n");
bdev_iscsi_io_complete(iscsi_io, SPDK_BDEV_IO_STATUS_FAILED); bdev_iscsi_io_complete(iscsi_io, SPDK_BDEV_IO_STATUS_FAILED);
@ -288,6 +289,21 @@ bdev_iscsi_destruct(void *ctx)
return rc; 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 static int
bdev_iscsi_poll(void *arg) 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.num_blocks * bdev_io->bdev->blocklen,
bdev_io->u.bdev.offset_blocks); bdev_io->u.bdev.offset_blocks);
break; 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: default:
bdev_iscsi_io_complete(iscsi_io, SPDK_BDEV_IO_STATUS_FAILED); bdev_iscsi_io_complete(iscsi_io, SPDK_BDEV_IO_STATUS_FAILED);
break; break;
@ -368,6 +390,7 @@ bdev_iscsi_io_type_supported(void *ctx, enum spdk_bdev_io_type io_type)
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: