iscsi: Emulate commands in iscsi_aio_ioctl as iscsi_ioctl
iscsi_ioctl emulates SG_GET_VERSION_NUM and SG_GET_SCSI_ID. Now that bdrv_ioctl() will be emulated with .bdrv_aio_ioctl, replicate the logic into iscsi_aio_ioctl to make them consistent. Signed-off-by: Fam Zheng <famz@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-id: 1447064214-29930-5-git-send-email-famz@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		@@ -97,6 +97,7 @@ typedef struct IscsiAIOCB {
 | 
			
		||||
    int status;
 | 
			
		||||
    int64_t sector_num;
 | 
			
		||||
    int nb_sectors;
 | 
			
		||||
    int ret;
 | 
			
		||||
#ifdef __linux__
 | 
			
		||||
    sg_io_hdr_t *ioh;
 | 
			
		||||
#endif
 | 
			
		||||
@@ -779,6 +780,38 @@ iscsi_aio_ioctl_cb(struct iscsi_context *iscsi, int status,
 | 
			
		||||
    iscsi_schedule_bh(acb);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void iscsi_ioctl_bh_completion(void *opaque)
 | 
			
		||||
{
 | 
			
		||||
    IscsiAIOCB *acb = opaque;
 | 
			
		||||
 | 
			
		||||
    qemu_bh_delete(acb->bh);
 | 
			
		||||
    acb->common.cb(acb->common.opaque, acb->ret);
 | 
			
		||||
    qemu_aio_unref(acb);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void iscsi_ioctl_handle_emulated(IscsiAIOCB *acb, int req, void *buf)
 | 
			
		||||
{
 | 
			
		||||
    BlockDriverState *bs = acb->common.bs;
 | 
			
		||||
    IscsiLun *iscsilun = bs->opaque;
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
 | 
			
		||||
    switch (req) {
 | 
			
		||||
    case SG_GET_VERSION_NUM:
 | 
			
		||||
        *(int *)buf = 30000;
 | 
			
		||||
        break;
 | 
			
		||||
    case SG_GET_SCSI_ID:
 | 
			
		||||
        ((struct sg_scsi_id *)buf)->scsi_type = iscsilun->type;
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        ret = -EINVAL;
 | 
			
		||||
    }
 | 
			
		||||
    assert(!acb->bh);
 | 
			
		||||
    acb->bh = aio_bh_new(bdrv_get_aio_context(bs),
 | 
			
		||||
                         iscsi_ioctl_bh_completion, acb);
 | 
			
		||||
    acb->ret = ret;
 | 
			
		||||
    qemu_bh_schedule(acb->bh);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static BlockAIOCB *iscsi_aio_ioctl(BlockDriverState *bs,
 | 
			
		||||
        unsigned long int req, void *buf,
 | 
			
		||||
        BlockCompletionFunc *cb, void *opaque)
 | 
			
		||||
@@ -788,8 +821,6 @@ static BlockAIOCB *iscsi_aio_ioctl(BlockDriverState *bs,
 | 
			
		||||
    struct iscsi_data data;
 | 
			
		||||
    IscsiAIOCB *acb;
 | 
			
		||||
 | 
			
		||||
    assert(req == SG_IO);
 | 
			
		||||
 | 
			
		||||
    acb = qemu_aio_get(&iscsi_aiocb_info, bs, cb, opaque);
 | 
			
		||||
 | 
			
		||||
    acb->iscsilun = iscsilun;
 | 
			
		||||
@@ -798,6 +829,11 @@ static BlockAIOCB *iscsi_aio_ioctl(BlockDriverState *bs,
 | 
			
		||||
    acb->buf         = NULL;
 | 
			
		||||
    acb->ioh         = buf;
 | 
			
		||||
 | 
			
		||||
    if (req != SG_IO) {
 | 
			
		||||
        iscsi_ioctl_handle_emulated(acb, req, buf);
 | 
			
		||||
        return &acb->common;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    acb->task = malloc(sizeof(struct scsi_task));
 | 
			
		||||
    if (acb->task == NULL) {
 | 
			
		||||
        error_report("iSCSI: Failed to allocate task for scsi command. %s",
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user