ping?
On Thu, Aug 30, 2012 at 5:28 PM, Ronnie Sahlberg
wrote:
> We need to support SG_IO from the synchronous iscsi_ioctl() since
> scsi-block uses this to do an INQ to the device to discover its properties
> This patch makes scsi-block work with iscsi.
>
> Signed-off-by: Ronnie Sahlberg
> ---
> block/iscsi.c | 20 +++-
> 1 files changed, 19 insertions(+), 1 deletions(-)
>
> diff --git a/block/iscsi.c b/block/iscsi.c
> index 355ce65..189ab6f 100644
> --- a/block/iscsi.c
> +++ b/block/iscsi.c
> @@ -537,7 +537,8 @@ iscsi_aio_ioctl_cb(struct iscsi_context *iscsi, int
> status,
>
> #define SG_ERR_DRIVER_SENSE0x08
>
> -if (status == SCSI_STATUS_CHECK_CONDITION && acb->task->datain.size >=
> 2) {
> +if (status == SCSI_STATUS_CHECK_CONDITION
> +&& acb->task->datain.size >= 2) {
> int ss;
>
> acb->ioh->driver_status |= SG_ERR_DRIVER_SENSE;
> @@ -622,9 +623,17 @@ static BlockDriverAIOCB
> *iscsi_aio_ioctl(BlockDriverState *bs,
> return &acb->common;
> }
>
> +
> +static void ioctl_cb(void *opaque, int status)
> +{
> +int *p_status = opaque;
> +*p_status = status;
> +}
> +
> static int iscsi_ioctl(BlockDriverState *bs, unsigned long int req, void
> *buf)
> {
> IscsiLun *iscsilun = bs->opaque;
> +int status;
>
> switch (req) {
> case SG_GET_VERSION_NUM:
> @@ -633,6 +642,15 @@ static int iscsi_ioctl(BlockDriverState *bs, unsigned
> long int req, void *buf)
> case SG_GET_SCSI_ID:
> ((struct sg_scsi_id *)buf)->scsi_type = iscsilun->type;
> break;
> +case SG_IO:
> +status = -EINPROGRESS;
> +iscsi_aio_ioctl(bs, req, buf, ioctl_cb, &status);
> +
> +while (status == -EINPROGRESS) {
> +qemu_aio_wait();
> +}
> +
> +return 0;
> default:
> return -1;
> }
> --
> 1.7.3.1
>