您当前的位置:首页 > IT编程 > C++
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:C++ virtio_blk_req_complete函数代码示例

51自学网 2021-06-03 09:42:54
  C++
这篇教程C++ virtio_blk_req_complete函数代码示例写得很实用,希望能帮到您。

本文整理汇总了C++中virtio_blk_req_complete函数的典型用法代码示例。如果您正苦于以下问题:C++ virtio_blk_req_complete函数的具体用法?C++ virtio_blk_req_complete怎么用?C++ virtio_blk_req_complete使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。

在下文中一共展示了virtio_blk_req_complete函数的27个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: virtio_blk_handle_request

static void virtio_blk_handle_request(VirtIOBlockReq *req,    MultiReqBuffer *mrb){    uint32_t type;    if (req->elem.out_num < 1 || req->elem.in_num < 1) {        error_report("virtio-blk missing headers");        exit(1);    }    if (req->elem.out_sg[0].iov_len < sizeof(*req->out) ||        req->elem.in_sg[req->elem.in_num - 1].iov_len < sizeof(*req->in)) {        error_report("virtio-blk header not in correct element");        exit(1);    }    req->out = (void *)req->elem.out_sg[0].iov_base;    req->in = (void *)req->elem.in_sg[req->elem.in_num - 1].iov_base;    type = ldl_p(&req->out->type);    if (type & VIRTIO_BLK_T_FLUSH) {        virtio_blk_handle_flush(req, mrb);    } else if (type & VIRTIO_BLK_T_SCSI_CMD) {        virtio_blk_handle_scsi(req);    } else if (type & VIRTIO_BLK_T_GET_ID) {        VirtIOBlock *s = req->dev;        /*         * NB: per existing s/n string convention the string is         * terminated by '/0' only when shorter than buffer.         */        strncpy(req->elem.in_sg[0].iov_base,                s->blk.serial ? s->blk.serial : "",                MIN(req->elem.in_sg[0].iov_len, VIRTIO_BLK_ID_BYTES));        virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);        g_free(req);    } else if (type & VIRTIO_BLK_T_OUT) {        qemu_iovec_init_external(&req->qiov, &req->elem.out_sg[1],                                 req->elem.out_num - 1);        virtio_blk_handle_write(req, mrb);    } else if (type == VIRTIO_BLK_T_IN || type == VIRTIO_BLK_T_BARRIER) {        /* VIRTIO_BLK_T_IN is 0, so we can't just & it. */        qemu_iovec_init_external(&req->qiov, &req->elem.in_sg[0],                                 req->elem.in_num - 1);        virtio_blk_handle_read(req);    } else {        virtio_blk_req_complete(req, VIRTIO_BLK_S_UNSUPP);        g_free(req);    }}
开发者ID:wdc-tools,项目名称:qemu,代码行数:51,


示例2: virtio_blk_rw_complete

static void virtio_blk_rw_complete(void *opaque, int ret){    VirtIOBlockReq *next = opaque;    while (next) {        VirtIOBlockReq *req = next;        next = req->mr_next;        trace_virtio_blk_rw_complete(req, ret);        if (req->qiov.nalloc != -1) {            /* If nalloc is != 1 req->qiov is a local copy of the original             * external iovec. It was allocated in submit_merged_requests             * to be able to merge requests. */            qemu_iovec_destroy(&req->qiov);        }        if (ret) {            int p = virtio_ldl_p(VIRTIO_DEVICE(req->dev), &req->out.type);            bool is_read = !(p & VIRTIO_BLK_T_OUT);            if (virtio_blk_handle_rw_error(req, -ret, is_read)) {                continue;            }        }        virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);        block_acct_done(blk_get_stats(req->dev->blk), &req->acct);        virtio_blk_free_request(req);    }}
开发者ID:MollyZhang,项目名称:esesc,代码行数:29,


示例3: virtio_blk_handle_rw_error

static int virtio_blk_handle_rw_error(VirtIOBlockReq *req, int error,    int is_read){    BlockErrorAction action = bdrv_get_on_error(req->dev->bs, is_read);    VirtIOBlock *s = req->dev;    if (action == BLOCK_ERR_IGNORE) {        bdrv_emit_qmp_error_event(s->bs, BDRV_ACTION_IGNORE, is_read);        return 0;    }    if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)            || action == BLOCK_ERR_STOP_ANY) {        req->next = s->rq;        s->rq = req;        bdrv_emit_qmp_error_event(s->bs, BDRV_ACTION_STOP, is_read);        vm_stop(RUN_STATE_IO_ERROR);        bdrv_iostatus_set_err(s->bs, error);    } else {        virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR);        bdrv_acct_done(s->bs, &req->acct);        g_free(req);        bdrv_emit_qmp_error_event(s->bs, BDRV_ACTION_REPORT, is_read);    }    return 1;}
开发者ID:0bliv10n,项目名称:s2e,代码行数:27,


示例4: virtio_blk_rw_complete

static void virtio_blk_rw_complete(void *opaque, int ret){    VirtIOBlockReq *req = opaque;    /* Copy read data to the guest */    if (!ret && !(req->out->type & VIRTIO_BLK_T_OUT)) {        size_t offset = 0;        int i;        for (i = 0; i < req->elem.in_num - 1; i++) {            size_t len;            /* Be pretty defensive wrt malicious guests */            len = MIN(req->elem.in_sg[i].iov_len,                      req->size - offset);            memcpy(req->elem.in_sg[i].iov_base,                   req->buffer + offset,                   len);            offset += len;        }    } else if (ret && (req->out->type & VIRTIO_BLK_T_OUT)) {        if (virtio_blk_handle_write_error(req, -ret))            return;    }    virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);}
开发者ID:ddk50,项目名称:ibkvm,代码行数:28,


示例5: virtio_blk_handle_scsi

static void virtio_blk_handle_scsi(VirtIOBlockReq *req){    int status;    status = virtio_blk_handle_scsi_req(req->dev, req->elem);    virtio_blk_req_complete(req, status);    virtio_blk_free_request(req);}
开发者ID:Samsara00,项目名称:qemu,代码行数:8,


示例6: virtio_blk_handle_scsi

static void virtio_blk_handle_scsi(VirtIOBlockReq *req){    int status;    status = virtio_blk_handle_scsi_req(req);    if (status != -EINPROGRESS) {        virtio_blk_req_complete(req, status);        virtio_blk_free_request(req);    }}
开发者ID:qhjindev,项目名称:qemu-vsock,代码行数:10,


示例7: virtio_blk_rw_complete

static void virtio_blk_rw_complete(void *opaque, int ret){    VirtIOBlockReq *req = opaque;    if (ret) {        int is_read = !(req->out->type & VIRTIO_BLK_T_OUT);        if (virtio_blk_handle_rw_error(req, -ret, is_read))            return;    }    virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);}
开发者ID:yujinyu,项目名称:QEMU_PACER,代码行数:12,


示例8: virtio_blk_flush_complete

static void virtio_blk_flush_complete(void *opaque, int ret){    VirtIOBlockReq *req = opaque;    if (ret) {        if (virtio_blk_handle_rw_error(req, -ret, 0)) {            return;        }    }    virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);}
开发者ID:dtatulea,项目名称:qemu,代码行数:12,


示例9: virtio_blk_flush_complete

static void virtio_blk_flush_complete(void *opaque, int ret){    VirtIOBlockReq *req = opaque;    if (ret) {        if (virtio_blk_handle_rw_error(req, -ret, 0)) {            return;        }    }    virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);    block_acct_done(blk_get_stats(req->dev->blk), &req->acct);    virtio_blk_free_request(req);}
开发者ID:qhjindev,项目名称:qemu-vsock,代码行数:14,


示例10: virtio_blk_handle_flush

static void virtio_blk_handle_flush(VirtIOBlockReq *req, MultiReqBuffer *mrb){    BlockDriverAIOCB *acb;    /*     * Make sure all outstanding writes are posted to the backing device.     */    virtio_submit_multiwrite(req->dev->bs, mrb);    acb = bdrv_aio_flush(req->dev->bs, virtio_blk_flush_complete, req);    if (!acb) {        virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR);    }}
开发者ID:yujinyu,项目名称:QEMU_PACER,代码行数:14,


示例11: virtio_blk_rw_complete

static void virtio_blk_rw_complete(void *opaque, int ret){    VirtIOBlockReq *req = opaque;    trace_virtio_blk_rw_complete(req, ret);    if (ret) {        int is_read = !(ldl_p(&req->out->type) & VIRTIO_BLK_T_OUT);        if (virtio_blk_handle_rw_error(req, -ret, is_read))            return;    }    virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);    bdrv_acct_done(req->dev->bs, &req->acct);    g_free(req);}
开发者ID:0bliv10n,项目名称:s2e,代码行数:16,


示例12: virtio_blk_rw_complete

static void virtio_blk_rw_complete(void *opaque, int ret){    VirtIOBlockReq *req = opaque;    trace_virtio_blk_rw_complete(req, ret);    if (ret) {        int p = virtio_ldl_p(VIRTIO_DEVICE(req->dev), &req->out.type);        bool is_read = !(p & VIRTIO_BLK_T_OUT);        if (virtio_blk_handle_rw_error(req, -ret, is_read))            return;    }    virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);    bdrv_acct_done(req->dev->bs, &req->acct);    virtio_blk_free_request(req);}
开发者ID:Samsara00,项目名称:qemu,代码行数:17,


示例13: virtio_blk_handle_request

static void virtio_blk_handle_request(VirtIOBlockReq *req,    MultiReqBuffer *mrb){    if (req->elem.out_num < 1 || req->elem.in_num < 1) {        fprintf(stderr, "virtio-blk missing headers/n");        exit(1);    }    if (req->elem.out_sg[0].iov_len < sizeof(*req->out) ||        req->elem.in_sg[req->elem.in_num - 1].iov_len < sizeof(*req->in)) {        fprintf(stderr, "virtio-blk header not in correct element/n");        exit(1);    }    req->out = (void *)req->elem.out_sg[0].iov_base;    req->in = (void *)req->elem.in_sg[req->elem.in_num - 1].iov_base;    if (req->out->type & VIRTIO_BLK_T_FLUSH) {        virtio_blk_handle_flush(mrb->blkreq, &mrb->num_writes,            req, &mrb->old_bs);    } else if (req->out->type & VIRTIO_BLK_T_SCSI_CMD) {        virtio_blk_handle_scsi(req);    } else if (req->out->type & VIRTIO_BLK_T_GET_ID) {        VirtIOBlock *s = req->dev;        /*         * NB: per existing s/n string convention the string is         * terminated by '/0' only when shorter than buffer.         */        strncpy(req->elem.in_sg[0].iov_base,                s->blk->serial ? s->blk->serial : "",                MIN(req->elem.in_sg[0].iov_len, VIRTIO_BLK_ID_BYTES));        virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);        qemu_free(req);    } else if (req->out->type & VIRTIO_BLK_T_OUT) {        qemu_iovec_init_external(&req->qiov, &req->elem.out_sg[1],                                 req->elem.out_num - 1);        virtio_blk_handle_write(mrb->blkreq, &mrb->num_writes,            req, &mrb->old_bs);    } else {        qemu_iovec_init_external(&req->qiov, &req->elem.in_sg[0],                                 req->elem.in_num - 1);        virtio_blk_handle_read(req);    }}
开发者ID:mithleshvrts,项目名称:qemu-kvm-rhel6,代码行数:45,


示例14: virtio_blk_handle_rw_error

static int virtio_blk_handle_rw_error(VirtIOBlockReq *req, int error,    bool is_read){    BlockErrorAction action = bdrv_get_error_action(req->dev->bs, is_read, error);    VirtIOBlock *s = req->dev;    if (action == BLOCK_ERROR_ACTION_STOP) {        req->next = s->rq;        s->rq = req;    } else if (action == BLOCK_ERROR_ACTION_REPORT) {        virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR);        bdrv_acct_done(s->bs, &req->acct);        virtio_blk_free_request(req);    }    bdrv_error_action(s->bs, action, is_read, error);    return action != BLOCK_ERROR_ACTION_IGNORE;}
开发者ID:Samsara00,项目名称:qemu,代码行数:18,


示例15: virtio_blk_ioctl_complete

static void virtio_blk_ioctl_complete(void *opaque, int status){    VirtIOBlockIoctlReq *ioctl_req = opaque;    VirtIOBlockReq *req = ioctl_req->req;    VirtIOBlock *s = req->dev;    VirtIODevice *vdev = VIRTIO_DEVICE(s);    struct virtio_scsi_inhdr *scsi;    struct sg_io_hdr *hdr;    scsi = (void *)req->elem.in_sg[req->elem.in_num - 2].iov_base;    if (status) {        status = VIRTIO_BLK_S_UNSUPP;        virtio_stl_p(vdev, &scsi->errors, 255);        goto out;    }    hdr = &ioctl_req->hdr;    /*     * From SCSI-Generic-HOWTO: "Some lower level drivers (e.g. ide-scsi)     * clear the masked_status field [hence status gets cleared too, see     * block/scsi_ioctl.c] even when a CHECK_CONDITION or COMMAND_TERMINATED     * status has occurred.  However they do set DRIVER_SENSE in driver_status     * field. Also a (sb_len_wr > 0) indicates there is a sense buffer.     */    if (hdr->status == 0 && hdr->sb_len_wr > 0) {        hdr->status = CHECK_CONDITION;    }    virtio_stl_p(vdev, &scsi->errors,                 hdr->status | (hdr->msg_status << 8) |                 (hdr->host_status << 16) | (hdr->driver_status << 24));    virtio_stl_p(vdev, &scsi->residual, hdr->resid);    virtio_stl_p(vdev, &scsi->sense_len, hdr->sb_len_wr);    virtio_stl_p(vdev, &scsi->data_len, hdr->dxfer_len);out:    aio_context_acquire(blk_get_aio_context(s->conf.conf.blk));    virtio_blk_req_complete(req, status);    virtio_blk_free_request(req);    aio_context_release(blk_get_aio_context(s->conf.conf.blk));    g_free(ioctl_req);}
开发者ID:Dovgalyuk,项目名称:qemu,代码行数:43,


示例16: virtio_blk_handle_write_error

static int virtio_blk_handle_write_error(VirtIOBlockReq *req, int error){    BlockInterfaceErrorAction action = drive_get_onerror(req->dev->bs);    VirtIOBlock *s = req->dev;    if (action == BLOCK_ERR_IGNORE)        return 0;    if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)            || action == BLOCK_ERR_STOP_ANY) {        req->next = s->rq;        s->rq = req;        vm_stop(0);    } else {        virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR);    }    return 1;}
开发者ID:ddk50,项目名称:ibkvm,代码行数:19,


示例17: virtio_blk_flush_complete

static void virtio_blk_flush_complete(void *opaque, int ret){    VirtIOBlockReq *req = opaque;    VirtIOBlock *s = req->dev;    aio_context_acquire(blk_get_aio_context(s->conf.conf.blk));    if (ret) {        if (virtio_blk_handle_rw_error(req, -ret, 0)) {            goto out;        }    }    virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);    block_acct_done(blk_get_stats(req->dev->blk), &req->acct);    virtio_blk_free_request(req);out:    aio_context_release(blk_get_aio_context(s->conf.conf.blk));}
开发者ID:Dovgalyuk,项目名称:qemu,代码行数:19,


示例18: virtio_blk_rw_complete

static void virtio_blk_rw_complete(void *opaque, int ret){    VirtIOBlockReq *next = opaque;    VirtIOBlock *s = next->dev;    VirtIODevice *vdev = VIRTIO_DEVICE(s);    aio_context_acquire(blk_get_aio_context(s->conf.conf.blk));    while (next) {        VirtIOBlockReq *req = next;        next = req->mr_next;        trace_virtio_blk_rw_complete(vdev, req, ret);        if (req->qiov.nalloc != -1) {            /* If nalloc is != -1 req->qiov is a local copy of the original             * external iovec. It was allocated in submit_requests to be             * able to merge requests. */            qemu_iovec_destroy(&req->qiov);        }        if (ret) {            int p = virtio_ldl_p(VIRTIO_DEVICE(req->dev), &req->out.type);            bool is_read = !(p & VIRTIO_BLK_T_OUT);            /* Note that memory may be dirtied on read failure.  If the             * virtio request is not completed here, as is the case for             * BLOCK_ERROR_ACTION_STOP, the memory may not be copied             * correctly during live migration.  While this is ugly,             * it is acceptable because the device is free to write to             * the memory until the request is completed (which will             * happen on the other side of the migration).             */            if (virtio_blk_handle_rw_error(req, -ret, is_read, true)) {                continue;            }        }        virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);        block_acct_done(blk_get_stats(req->dev->blk), &req->acct);        virtio_blk_free_request(req);    }    aio_context_release(blk_get_aio_context(s->conf.conf.blk));}
开发者ID:cminyard,项目名称:qemu,代码行数:41,


示例19: virtio_blk_handle_request

static void virtio_blk_handle_request(VirtIOBlockReq *req,    MultiReqBuffer *mrb){    uint32_t type;    if (req->elem.out_num < 1 || req->elem.in_num < 1) {        error_report("virtio-blk missing headers");        exit(1);    }    if (req->elem.out_sg[0].iov_len < sizeof(*req->out) ||        req->elem.in_sg[req->elem.in_num - 1].iov_len < sizeof(*req->in)) {        error_report("virtio-blk header not in correct element");        exit(1);    }    req->out = (void *)req->elem.out_sg[0].iov_base;    req->in = (void *)req->elem.in_sg[req->elem.in_num - 1].iov_base;    type = ldl_p(&req->out->type);    if (type & VIRTIO_BLK_T_FLUSH) {        virtio_blk_handle_flush(req, mrb);    } else if (type & VIRTIO_BLK_T_SCSI_CMD) {        virtio_blk_handle_scsi(req);    } else if (type & VIRTIO_BLK_T_GET_ID) {        VirtIOBlock *s = req->dev;        memcpy(req->elem.in_sg[0].iov_base, s->sn,               MIN(req->elem.in_sg[0].iov_len, sizeof(s->sn)));        virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);    } else if (type & VIRTIO_BLK_T_OUT) {        qemu_iovec_init_external(&req->qiov, &req->elem.out_sg[1],                                 req->elem.out_num - 1);        virtio_blk_handle_write(req, mrb);    } else {        qemu_iovec_init_external(&req->qiov, &req->elem.in_sg[0],                                 req->elem.in_num - 1);        virtio_blk_handle_read(req);    }}
开发者ID:dtatulea,项目名称:qemu,代码行数:41,


示例20: virtio_blk_rw_complete

static void virtio_blk_rw_complete(void *opaque, int ret){    VirtIOBlockReq *next = opaque;    while (next) {        VirtIOBlockReq *req = next;        next = req->mr_next;        trace_virtio_blk_rw_complete(req, ret);        if (req->qiov.nalloc != -1) {            /* If nalloc is != 1 req->qiov is a local copy of the original             * external iovec. It was allocated in submit_merged_requests             * to be able to merge requests. */            qemu_iovec_destroy(&req->qiov);        }        if (ret) {            int p = virtio_ldl_p(VIRTIO_DEVICE(req->dev), &req->out.type);            bool is_read = !(p & VIRTIO_BLK_T_OUT);            /* Note that memory may be dirtied on read failure.  If the             * virtio request is not completed here, as is the case for             * BLOCK_ERROR_ACTION_STOP, the memory may not be copied             * correctly during live migration.  While this is ugly,             * it is acceptable because the device is free to write to             * the memory until the request is completed (which will             * happen on the other side of the migration).             */            if (virtio_blk_handle_rw_error(req, -ret, is_read)) {                /* Break the link in case the next request is added to the                 * restart queue and is going to be parsed from the ring again.                 */                req->mr_next = NULL;                continue;            }        }        virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);        block_acct_done(blk_get_stats(req->dev->blk), &req->acct);        virtio_blk_free_request(req);    }}
开发者ID:chelseaqwang,项目名称:qemu-tpm,代码行数:41,


示例21: virtio_blk_handle_rw_error

static int virtio_blk_handle_rw_error(VirtIOBlockReq *req, int error,    bool is_read){    VirtIOBlock *s = req->dev;    BlockErrorAction action = blk_get_error_action(s->blk, is_read, error);    if (action == BLOCK_ERROR_ACTION_STOP) {        /* Break the link as the next request is going to be parsed from the         * ring again. Otherwise we may end up doing a double completion! */        req->mr_next = NULL;        req->next = s->rq;        s->rq = req;    } else if (action == BLOCK_ERROR_ACTION_REPORT) {        virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR);        block_acct_failed(blk_get_stats(s->blk), &req->acct);        virtio_blk_free_request(req);    }    blk_error_action(s->blk, action, is_read, error);    return action != BLOCK_ERROR_ACTION_IGNORE;}
开发者ID:gkurz,项目名称:qemu,代码行数:21,


示例22: virtio_blk_discard_write_zeroes_complete

static void virtio_blk_discard_write_zeroes_complete(void *opaque, int ret){    VirtIOBlockReq *req = opaque;    VirtIOBlock *s = req->dev;    bool is_write_zeroes = (virtio_ldl_p(VIRTIO_DEVICE(s), &req->out.type) &                            ~VIRTIO_BLK_T_BARRIER) == VIRTIO_BLK_T_WRITE_ZEROES;    aio_context_acquire(blk_get_aio_context(s->conf.conf.blk));    if (ret) {        if (virtio_blk_handle_rw_error(req, -ret, false, is_write_zeroes)) {            goto out;        }    }    virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);    if (is_write_zeroes) {        block_acct_done(blk_get_stats(s->blk), &req->acct);    }    virtio_blk_free_request(req);out:    aio_context_release(blk_get_aio_context(s->conf.conf.blk));}
开发者ID:cminyard,项目名称:qemu,代码行数:23,


示例23: virtio_blk_handle_rw_error

static int virtio_blk_handle_rw_error(VirtIOBlockReq *req, int error,    int is_read){    BlockErrorAction action = bdrv_get_on_error(req->dev->bs, is_read);    VirtIOBlock *s = req->dev;    if (action == BLOCK_ERR_IGNORE) {        bdrv_mon_event(s->bs, BDRV_ACTION_IGNORE, is_read);        return 0;    }    if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)            || action == BLOCK_ERR_STOP_ANY) {        req->next = s->rq;        s->rq = req;        bdrv_mon_event(s->bs, BDRV_ACTION_STOP, is_read);        vm_stop(0);    } else {        virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR);        bdrv_mon_event(s->bs, BDRV_ACTION_REPORT, is_read);    }    return 1;}
开发者ID:dtatulea,项目名称:qemu,代码行数:24,


示例24: virtio_blk_handle_scsi

static void virtio_blk_handle_scsi(VirtIOBlockReq *req){    virtio_blk_req_complete(req, VIRTIO_BLK_S_UNSUPP);}
开发者ID:dtatulea,项目名称:qemu,代码行数:4,


示例25: virtio_blk_handle_scsi

static void virtio_blk_handle_scsi(VirtIOBlockReq *req){    struct sg_io_hdr hdr;    int ret;    int status;    int i;    if ((req->dev->vdev.guest_features & (1 << VIRTIO_BLK_F_SCSI)) == 0) {        virtio_blk_req_complete(req, VIRTIO_BLK_S_UNSUPP);        g_free(req);        return;    }    /*     * We require at least one output segment each for the virtio_blk_outhdr     * and the SCSI command block.     *     * We also at least require the virtio_blk_inhdr, the virtio_scsi_inhdr     * and the sense buffer pointer in the input segments.     */    if (req->elem.out_num < 2 || req->elem.in_num < 3) {        virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR);        g_free(req);        return;    }    /*     * No support for bidirection commands yet.     */    if (req->elem.out_num > 2 && req->elem.in_num > 3) {        virtio_blk_req_complete(req, VIRTIO_BLK_S_UNSUPP);        g_free(req);        return;    }    /*     * The scsi inhdr is placed in the second-to-last input segment, just     * before the regular inhdr.     */    req->scsi = (void *)req->elem.in_sg[req->elem.in_num - 2].iov_base;    memset(&hdr, 0, sizeof(struct sg_io_hdr));    hdr.interface_id = 'S';    hdr.cmd_len = req->elem.out_sg[1].iov_len;    hdr.cmdp = req->elem.out_sg[1].iov_base;    hdr.dxfer_len = 0;    if (req->elem.out_num > 2) {        /*         * If there are more than the minimally required 2 output segments         * there is write payload starting from the third iovec.         */        hdr.dxfer_direction = SG_DXFER_TO_DEV;        hdr.iovec_count = req->elem.out_num - 2;        for (i = 0; i < hdr.iovec_count; i++)            hdr.dxfer_len += req->elem.out_sg[i + 2].iov_len;        hdr.dxferp = req->elem.out_sg + 2;    } else if (req->elem.in_num > 3) {        /*         * If we have more than 3 input segments the guest wants to actually         * read data.         */        hdr.dxfer_direction = SG_DXFER_FROM_DEV;        hdr.iovec_count = req->elem.in_num - 3;        for (i = 0; i < hdr.iovec_count; i++)            hdr.dxfer_len += req->elem.in_sg[i].iov_len;        hdr.dxferp = req->elem.in_sg;    } else {        /*         * Some SCSI commands don't actually transfer any data.         */        hdr.dxfer_direction = SG_DXFER_NONE;    }    hdr.sbp = req->elem.in_sg[req->elem.in_num - 3].iov_base;    hdr.mx_sb_len = req->elem.in_sg[req->elem.in_num - 3].iov_len;    ret = bdrv_ioctl(req->dev->bs, SG_IO, &hdr);    if (ret) {        status = VIRTIO_BLK_S_UNSUPP;        hdr.status = ret;        hdr.resid = hdr.dxfer_len;    } else if (hdr.status) {        status = VIRTIO_BLK_S_IOERR;    } else {        status = VIRTIO_BLK_S_OK;    }    /*     * From SCSI-Generic-HOWTO: "Some lower level drivers (e.g. ide-scsi)     * clear the masked_status field [hence status gets cleared too, see     * block/scsi_ioctl.c] even when a CHECK_CONDITION or COMMAND_TERMINATED     * status has occurred.  However they do set DRIVER_SENSE in driver_status     * field. Also a (sb_len_wr > 0) indicates there is a sense buffer.     */    if (hdr.status == 0 && hdr.sb_len_wr > 0) {//.........这里部分代码省略.........
开发者ID:0bliv10n,项目名称:s2e,代码行数:101,


示例26: virtio_blk_handle_request

void virtio_blk_handle_request(VirtIOBlockReq *req, MultiReqBuffer *mrb){    uint32_t type;    struct iovec *in_iov = req->elem->in_sg;    struct iovec *iov = req->elem->out_sg;    unsigned in_num = req->elem->in_num;    unsigned out_num = req->elem->out_num;    if (req->elem->out_num < 1 || req->elem->in_num < 1) {        error_report("virtio-blk missing headers");        exit(1);    }    if (unlikely(iov_to_buf(iov, out_num, 0, &req->out,                            sizeof(req->out)) != sizeof(req->out))) {        error_report("virtio-blk request outhdr too short");        exit(1);    }    iov_discard_front(&iov, &out_num, sizeof(req->out));    if (in_num < 1 ||        in_iov[in_num - 1].iov_len < sizeof(struct virtio_blk_inhdr)) {        error_report("virtio-blk request inhdr too short");        exit(1);    }    req->in = (void *)in_iov[in_num - 1].iov_base              + in_iov[in_num - 1].iov_len              - sizeof(struct virtio_blk_inhdr);    iov_discard_back(in_iov, &in_num, sizeof(struct virtio_blk_inhdr));    type = virtio_ldl_p(VIRTIO_DEVICE(req->dev), &req->out.type);    if (type & VIRTIO_BLK_T_FLUSH) {        virtio_blk_handle_flush(req, mrb);    } else if (type & VIRTIO_BLK_T_SCSI_CMD) {        virtio_blk_handle_scsi(req);    } else if (type & VIRTIO_BLK_T_GET_ID) {        VirtIOBlock *s = req->dev;        /*         * NB: per existing s/n string convention the string is         * terminated by '/0' only when shorter than buffer.         */        strncpy(req->elem->in_sg[0].iov_base,                s->blk.serial ? s->blk.serial : "",                MIN(req->elem->in_sg[0].iov_len, VIRTIO_BLK_ID_BYTES));        virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);        virtio_blk_free_request(req);    } else if (type & VIRTIO_BLK_T_OUT) {        qemu_iovec_init_external(&req->qiov, &req->elem->out_sg[1],                                 req->elem->out_num - 1);        virtio_blk_handle_write(req, mrb);    } else if (type == VIRTIO_BLK_T_IN || type == VIRTIO_BLK_T_BARRIER) {        /* VIRTIO_BLK_T_IN is 0, so we can't just & it. */        qemu_iovec_init_external(&req->qiov, &req->elem->in_sg[0],                                 req->elem->in_num - 1);        virtio_blk_handle_read(req);    } else {        virtio_blk_req_complete(req, VIRTIO_BLK_S_UNSUPP);        virtio_blk_free_request(req);    }}
开发者ID:Samsara00,项目名称:qemu,代码行数:64,


示例27: virtio_blk_flush_complete

static void virtio_blk_flush_complete(void *opaque, int ret){    VirtIOBlockReq *req = opaque;    virtio_blk_req_complete(req, ret ? VIRTIO_BLK_S_IOERR : VIRTIO_BLK_S_OK);}
开发者ID:yujinyu,项目名称:QEMU_PACER,代码行数:6,



注:本文中的virtio_blk_req_complete函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


C++ virtio_has_feature函数代码示例
C++ virt_to_phys函数代码示例
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。