[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH v4 4/9] iscsi: Emulate commands in iscsi_aio_ioctl a
From: |
Fam Zheng |
Subject: |
[Qemu-block] [PATCH v4 4/9] iscsi: Emulate commands in iscsi_aio_ioctl as iscsi_ioctl |
Date: |
Mon, 9 Nov 2015 18:16:49 +0800 |
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 <address@hidden>
Reviewed-by: Kevin Wolf <address@hidden>
---
block/iscsi.c | 40 ++++++++++++++++++++++++++++++++++++++--
1 file changed, 38 insertions(+), 2 deletions(-)
diff --git a/block/iscsi.c b/block/iscsi.c
index 9a628b7..b3fa0a0 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,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)
@@ -735,8 +768,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 +776,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",
--
2.4.3
- [Qemu-block] [PATCH v4 0/9] block: Fixes for bdrv_drain, Fam Zheng, 2015/11/09
- [Qemu-block] [PATCH v4 1/9] block: Add more types for tracked request, Fam Zheng, 2015/11/09
- [Qemu-block] [PATCH v4 2/9] block: Track flush requests, Fam Zheng, 2015/11/09
- [Qemu-block] [PATCH v4 3/9] block: Track discard requests, Fam Zheng, 2015/11/09
- [Qemu-block] [PATCH v4 4/9] iscsi: Emulate commands in iscsi_aio_ioctl as iscsi_ioctl,
Fam Zheng <=
- [Qemu-block] [PATCH v4 6/9] block: Emulate bdrv_ioctl with bdrv_aio_ioctl and track both, Fam Zheng, 2015/11/09
- [Qemu-block] [PATCH v4 5/9] block: Add ioctl parameter fields to BlockRequest, Fam Zheng, 2015/11/09
- [Qemu-block] [PATCH v4 7/9] block: Drop BlockDriver.bdrv_ioctl, Fam Zheng, 2015/11/09
- [Qemu-block] [PATCH v4 8/9] block: Introduce BlockDriver.bdrv_drain callback, Fam Zheng, 2015/11/09
- [Qemu-block] [PATCH v4 9/9] qed: Implement .bdrv_drain, Fam Zheng, 2015/11/09
- Re: [Qemu-block] [PATCH v4 0/9] block: Fixes for bdrv_drain, Stefan Hajnoczi, 2015/11/09