Message ID | 1445840693-3177-5-git-send-email-famz@redhat.com |
---|---|
State | New |
Headers | show |
Am 26.10.2015 um 07:24 hat Fam Zheng geschrieben: > 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> > --- > block/iscsi.c | 39 +++++++++++++++++++++++++++++++++++++-- > 1 file changed, 37 insertions(+), 2 deletions(-) > > diff --git a/block/iscsi.c b/block/iscsi.c > index 93f1ee4..94cbdf2 100644 > --- a/block/iscsi.c > +++ b/block/iscsi.c > @@ -96,6 +96,7 @@ typedef struct IscsiAIOCB { > int status; > int64_t sector_num; > int nb_sectors; > + int ret; > #ifdef __linux__ > sg_io_hdr_t *ioh; > #endif > @@ -726,6 +727,37 @@ 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)? Kevin
On Wed, 10/28 10:51, Kevin Wolf wrote: > Am 26.10.2015 um 07:24 hat Fam Zheng geschrieben: > > 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> > > --- > > block/iscsi.c | 39 +++++++++++++++++++++++++++++++++++++-- > > 1 file changed, 37 insertions(+), 2 deletions(-) > > > > diff --git a/block/iscsi.c b/block/iscsi.c > > index 93f1ee4..94cbdf2 100644 > > --- a/block/iscsi.c > > +++ b/block/iscsi.c > > @@ -96,6 +96,7 @@ typedef struct IscsiAIOCB { > > int status; > > int64_t sector_num; > > int nb_sectors; > > + int ret; > > #ifdef __linux__ > > sg_io_hdr_t *ioh; > > #endif > > @@ -726,6 +727,37 @@ 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)? > Yes, will fix. Fam
diff --git a/block/iscsi.c b/block/iscsi.c index 93f1ee4..94cbdf2 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -96,6 +96,7 @@ typedef struct IscsiAIOCB { int status; int64_t sector_num; int nb_sectors; + int ret; #ifdef __linux__ sg_io_hdr_t *ioh; #endif @@ -726,6 +727,37 @@ 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); +} + +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) @@ -735,8 +767,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; @@ -745,6 +775,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",
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> --- block/iscsi.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-)