]> git.proxmox.com Git - qemu.git/blobdiff - hw/scsi-generic.c
new scsi-generic abstraction, use SG_IO (Christoph Hellwig)
[qemu.git] / hw / scsi-generic.c
index 53e895127088fc6cce08ac257fc66e1e76528365..f4c615b626379ac43436bde315c1cf2373b8bbc5 100644 (file)
@@ -201,8 +201,6 @@ static int execute_command(BlockDriverState *bdrv,
                            SCSIRequest *r, int direction,
                           BlockDriverCompletionFunc *complete)
 {
-    int ret;
-
     r->io_header.interface_id = 'S';
     r->io_header.dxfer_direction = direction;
     r->io_header.dxferp = r->buf;
@@ -215,27 +213,7 @@ static int execute_command(BlockDriverState *bdrv,
     r->io_header.usr_ptr = r;
     r->io_header.flags |= SG_FLAG_DIRECT_IO;
 
-    ret = bdrv_sg_send_command(bdrv, &r->io_header, sizeof(r->io_header));
-    if (ret < 0) {
-        BADF("execute_command: write failed ! (%d)\n", errno);
-        return -1;
-    }
-    if (complete == NULL) {
-        int ret;
-        r->aiocb = NULL;
-        while ((ret = bdrv_sg_recv_response(bdrv, &r->io_header,
-                                            sizeof(r->io_header))) < 0 &&
-               ret == -EINTR)
-            ;
-        if (ret < 0) {
-            BADF("execute_command: read failed !\n");
-            return -1;
-        }
-        return 0;
-    }
-
-    r->aiocb = bdrv_sg_aio_read(bdrv, (uint8_t*)&r->io_header,
-                                sizeof(r->io_header), complete, r);
+    r->aiocb = bdrv_aio_ioctl(bdrv, SG_IO, &r->io_header, complete, r);
     if (r->aiocb == NULL) {
         BADF("execute_command: read failed !\n");
         return -1;
@@ -637,14 +615,7 @@ static int get_blocksize(BlockDriverState *bdrv)
     io_header.sbp = sensebuf;
     io_header.timeout = 6000; /* XXX */
 
-    ret = bdrv_sg_send_command(bdrv, &io_header, sizeof(io_header));
-    if (ret < 0)
-        return -1;
-
-    while ((ret = bdrv_sg_recv_response(bdrv, &io_header, sizeof(io_header))) < 0 &&
-           ret == -EINTR)
-        ;
-
+    ret = bdrv_ioctl(bdrv, SG_IO, &io_header);
     if (ret < 0)
         return -1;
 
@@ -675,14 +646,7 @@ static int get_stream_blocksize(BlockDriverState *bdrv)
     io_header.sbp = sensebuf;
     io_header.timeout = 6000; /* XXX */
 
-    ret = bdrv_sg_send_command(bdrv, &io_header, sizeof(io_header));
-    if (ret < 0)
-        return -1;
-
-    while ((ret = bdrv_sg_recv_response(bdrv, &io_header, sizeof(io_header))) < 0 &&
-           ret == -EINTR)
-        ;
-
+    ret = bdrv_ioctl(bdrv, SG_IO, &io_header);
     if (ret < 0)
         return -1;