diff mbox

[4/9] iscsi: Emulate commands in iscsi_aio_ioctl as iscsi_ioctl

Message ID 1445840693-3177-5-git-send-email-famz@redhat.com
State New
Headers show

Commit Message

Fam Zheng Oct. 26, 2015, 6:24 a.m. UTC
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(-)

Comments

Kevin Wolf Oct. 28, 2015, 9:51 a.m. UTC | #1
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
Fam Zheng Oct. 29, 2015, 1:35 a.m. UTC | #2
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 mbox

Patch

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",