@@ -175,20 +175,6 @@ static void scsi_command_complete(void *opaque, int ret)
scsi_command_complete_noio(r, ret);
}
-static int execute_command(BlockBackend *blk,
- SCSIGenericReq *r, int direction,
- BlockCompletionFunc *complete)
-{
- scsi_buf_init_io_header(r, direction);
-
- r->req.aiocb = blk_aio_ioctl(blk, SG_IO, &r->io_header, complete, r);
- if (r->req.aiocb == NULL) {
- return -EIO;
- }
-
- return 0;
-}
-
static void scsi_buf_read_complete(void *opaque, int ret)
{
SCSIGenericReq *r = (SCSIGenericReq *)opaque;
@@ -242,12 +228,33 @@ static void scsi_buf_read_complete(void *opaque, int ret)
scsi_req_unref(&r->req);
}
+/*
+ * Execute the request using an intermediate buffer.
+ *
+ * This function does the following:
+ *
+ * a. Initialize the io header for the ioctl request.
+ * b. Perform the ioctl request using blk_aio_ioctl().
+ */
+static void scsi_buf_do_request(SCSIGenericReq *r, int direction,
+ BlockCompletionFunc *complete)
+{
+ SCSIDevice *s = r->req.dev;
+
+ scsi_buf_init_io_header(r, direction);
+
+ r->req.aiocb = blk_aio_ioctl(s->conf.blk, SG_IO,
+ &r->io_header, complete, r);
+
+ if (!r->req.aiocb) {
+ scsi_command_complete_noio(r, -EIO);
+ }
+}
+
/* Read more data from scsi device into buffer. */
static void scsi_buf_read_data(SCSIRequest *req)
{
SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
- SCSIDevice *s = r->req.dev;
- int ret;
DPRINTF("scsi_buf_read_data 0x%x\n", req->tag);
@@ -258,11 +265,7 @@ static void scsi_buf_read_data(SCSIRequest *req)
return;
}
- ret = execute_command(s->conf.blk, r, SG_DXFER_FROM_DEV,
- scsi_buf_read_complete);
- if (ret < 0) {
- scsi_command_complete_noio(r, ret);
- }
+ scsi_buf_do_request(r, SG_DXFER_FROM_DEV, scsi_buf_read_complete);
}
static void scsi_common_read_data(SCSIRequest *req)
@@ -299,8 +302,6 @@ static void scsi_buf_write_complete(void *opaque, int ret)
static void scsi_buf_write_data(SCSIRequest *req)
{
SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
- SCSIDevice *s = r->req.dev;
- int ret;
DPRINTF("scsi_buf_write_data 0x%x\n", req->tag);
if (r->len == 0) {
@@ -311,11 +312,8 @@ static void scsi_buf_write_data(SCSIRequest *req)
/* The request is used as the AIO opaque value, so add a ref. */
scsi_req_ref(&r->req);
- ret = execute_command(s->conf.blk, r, SG_DXFER_TO_DEV,
- scsi_buf_write_complete);
- if (ret < 0) {
- scsi_command_complete_noio(r, ret);
- }
+
+ scsi_buf_do_request(r, SG_DXFER_TO_DEV, scsi_buf_write_complete);
}
static void scsi_common_write_data(SCSIRequest *req)
@@ -339,8 +337,6 @@ static uint8_t *scsi_get_buf(SCSIRequest *req)
static int32_t scsi_common_send_command(SCSIRequest *req, uint8_t *cmd)
{
SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
- SCSIDevice *s = r->req.dev;
- int ret;
#ifdef DEBUG_SCSI
{
@@ -358,12 +354,7 @@ static int32_t scsi_common_send_command(SCSIRequest *req, uint8_t *cmd)
r->buf = NULL;
/* The request is used as the AIO opaque value, so add a ref. */
scsi_req_ref(&r->req);
- ret = execute_command(s->conf.blk, r, SG_DXFER_NONE,
- scsi_command_complete);
- if (ret < 0) {
- scsi_command_complete_noio(r, ret);
- return 0;
- }
+ scsi_buf_do_request(r, SG_DXFER_NONE, scsi_command_complete);
return 0;
}