The function does the same initialization, and matches with scsi_free_scsi_task() usage, and qemu doesn't need to know the allocator details.
Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> --- block/iscsi.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/block/iscsi.c b/block/iscsi.c index 5daa201181..a6bcd8eb13 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -1013,6 +1013,7 @@ static BlockAIOCB *iscsi_aio_ioctl(BlockDriverState *bs, struct iscsi_context *iscsi = iscsilun->iscsi; struct iscsi_data data; IscsiAIOCB *acb; + int xfer_dir; acb = qemu_aio_get(&iscsi_aiocb_info, bs, cb, opaque); @@ -1034,30 +1035,26 @@ static BlockAIOCB *iscsi_aio_ioctl(BlockDriverState *bs, return NULL; } - acb->task = malloc(sizeof(struct scsi_task)); - if (acb->task == NULL) { - error_report("iSCSI: Failed to allocate task for scsi command. %s", - iscsi_get_error(iscsi)); - qemu_aio_unref(acb); - return NULL; - } - memset(acb->task, 0, sizeof(struct scsi_task)); - switch (acb->ioh->dxfer_direction) { case SG_DXFER_TO_DEV: - acb->task->xfer_dir = SCSI_XFER_WRITE; + xfer_dir = SCSI_XFER_WRITE; break; case SG_DXFER_FROM_DEV: - acb->task->xfer_dir = SCSI_XFER_READ; + xfer_dir = SCSI_XFER_READ; break; default: - acb->task->xfer_dir = SCSI_XFER_NONE; + xfer_dir = SCSI_XFER_NONE; break; } - acb->task->cdb_size = acb->ioh->cmd_len; - memcpy(&acb->task->cdb[0], acb->ioh->cmdp, acb->ioh->cmd_len); - acb->task->expxferlen = acb->ioh->dxfer_len; + acb->task = scsi_create_task(acb->ioh->cmd_len, acb->ioh->cmdp, + xfer_dir, acb->ioh->dxfer_len); + if (acb->task == NULL) { + error_report("iSCSI: Failed to allocate task for scsi command. %s", + iscsi_get_error(iscsi)); + qemu_aio_unref(acb); + return NULL; + } data.size = 0; qemu_mutex_lock(&iscsilun->mutex); -- 2.13.0.91.g00982b8dd