All of lore.kernel.org
 help / color / mirror / Atom feed
From: Blue Swirl <blauwirbel@gmail.com>
To: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
Cc: kwolf@redhat.com, aliguori@us.ibm.com, stefanha@gmail.com,
	qemu-devel@nongnu.org, pbonzini@redhat.com, eblake@redhat.com
Subject: Re: [Qemu-devel] [PATCH 5/6] libqblock test example
Date: Mon, 3 Sep 2012 19:27:03 +0000	[thread overview]
Message-ID: <CAAu8pHtpnF8uyy55RqqAk2jOLbb7+9YBYRJiWZhEgjNmaUF3LQ@mail.gmail.com> (raw)
In-Reply-To: <1346663926-20188-6-git-send-email-xiawenc@linux.vnet.ibm.com>

On Mon, Sep 3, 2012 at 9:18 AM, Wenchao Xia <xiawenc@linux.vnet.ibm.com> wrote:
>   In this example, user first create two qcow2 images, and then get the
> backing file relationship information of them. Then does write and read
> sync IO on them.
>
> Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
> ---
>  tests/libqblock/libqblock-test.c |  219 ++++++++++++++++++++++++++++++++++++++
>  1 files changed, 219 insertions(+), 0 deletions(-)
>  create mode 100644 tests/libqblock/libqblock-test.c
>
> diff --git a/tests/libqblock/libqblock-test.c b/tests/libqblock/libqblock-test.c
> new file mode 100644
> index 0000000..9a1eac5
> --- /dev/null
> +++ b/tests/libqblock/libqblock-test.c
> @@ -0,0 +1,219 @@
> +#include <stdarg.h>
> +#include <stdio.h>
> +#include <unistd.h>
> +#include <inttypes.h>
> +#include <string.h>
> +
> +#include "libqblock.h"
> +
> +static unsigned char buf_r[1024];
> +static unsigned char buf_w[1024] = {4, 0, 0, 2};
> +
> +struct verify_data {

VerifyData

> +    unsigned char *buf_r;
> +    unsigned char *buf_w;
> +    int len;
> +};
> +
> +static void print_loc(struct QBlockOptionLoc *loc)
> +{
> +    switch (loc->prot_type) {
> +    case QB_PROTO_NONE:
> +        printf("protocol type [none].");
> +        break;
> +    case QB_PROTO_FILE:
> +        printf("protocol type [file], filename [%s].",
> +               loc->prot_op.o_file.filename);
> +        break;
> +    default:
> +        printf("protocol type not supported.");
> +        break;
> +    }
> +}
> +
> +static void print_info_image_static(struct QBlockInfoImageStatic *info)
> +{
> +    printf("=======image location:\n");
> +    print_loc(&info->loc);
> +    printf("\nvirtual_size %" PRId64 ", format type %d,",
> +           info->virt_size, info->fmt_type);
> +    printf("allocated size %" PRId64 ", encrypt %d,",
> +           info->allocated_size, info->encrypt);
> +    printf("\nbacking image location:\n");
> +    print_loc(&info->backing_loc);
> +    printf("\n");
> +}
> +
> +static void test_check(struct verify_data *vdata)
> +{
> +    int cmp;
> +    cmp = memcmp(vdata->buf_r, vdata->buf_w, vdata->len);
> +    if (cmp == 0) {
> +        printf("compare succeed, %d.\n", vdata->buf_r[24]);
> +    } else {
> +        printf("!!! compare fail, %d.\n", vdata->buf_r[24]);
> +        exit(1);
> +    }
> +}
> +
> +int main(int argc, char **argv)
> +{
> +    char *filename1, *filename2;
> +    struct QBroker *broker = NULL;
> +    struct QBlockState *qbs = NULL;
> +    struct QBlockOptionLoc *ol = NULL;
> +    struct QBlockOptionFormat *of = NULL;
> +    struct QBlockInfoImageStatic *info_st = NULL;
> +    int ret, flag;
> +    int test_offset = 0;
> +    int test_len = 512;
> +    struct verify_data vdata;
> +    char err_str[1024];
> +
> +    vdata.buf_r = buf_r;
> +    vdata.buf_w = buf_w;
> +    vdata.len = test_len;
> +
> +    filename1 = (char *)"./qemu_image1";
> +    filename2 = (char *)"./qemu_image2";

The casts remove 'const' qualifier, how can that be safe?

> +    printf("qemu test, filename1 is %s, filename2 is %s.\n",
> +                                       filename1, filename2);
> +
> +    libqblock_init();
> +
> +    ret = qb_broker_new(&broker);
> +    if (ret < 0) {
> +        goto free;
> +    }
> +
> +    ret = qb_state_new(broker, &qbs);
> +    if (ret < 0) {
> +        goto free;
> +    }
> +
> +    ret = qb_ol_new(broker, &ol);
> +    if (ret < 0) {
> +        goto free;
> +    }
> +
> +    ret = qb_of_new(broker, &of);
> +    if (ret < 0) {
> +        goto free;
> +    }
> +
> +    /* create a new image */
> +
> +    ol->prot_type = QB_PROTO_FILE;
> +    ol->prot_op.o_file.filename = filename2;
> +    of->fmt_type = QB_FMT_QCOW2;
> +    of->fmt_op.o_qcow2.virt_size = 100 * 1024;
> +    flag = 0;
> +
> +    ret = qb_create(broker, qbs, ol, of, flag);
> +    if (ret < 0) {
> +        qb_error_get_human_str(broker, err_str, sizeof(err_str));
> +        printf("create fail 1. %s.\n", err_str);
> +        goto unlink;
> +    }
> +
> +    ol->prot_type = QB_PROTO_FILE;
> +    ol->prot_op.o_file.filename = filename1;
> +    of->fmt_type = QB_FMT_QCOW2;
> +    of->fmt_op.o_qcow2.backing_loc.prot_type = QB_PROTO_FILE;
> +    of->fmt_op.o_qcow2.backing_loc.prot_op.o_file.filename = filename2;
> +    flag = 0;
> +    ret = qb_create(broker, qbs, ol, of, flag);
> +    if (ret < 0) {
> +        qb_error_get_human_str(broker, err_str, sizeof(err_str));
> +        printf("create fail 2. %s.\n", err_str);
> +        goto unlink;
> +    }
> +
> +    /* get informations */
> +    ol->prot_type = QB_PROTO_FILE;
> +    ol->prot_op.o_file.filename = filename1;
> +    of->fmt_type = QB_FMT_NONE;
> +    flag = LIBQBLOCK_O_NO_BACKING;
> +    ret = qb_open(broker, qbs, ol, of, flag);
> +    if (ret < 0) {
> +        qb_error_get_human_str(broker, err_str, sizeof(err_str));
> +        printf("info getting, open failed. %s.\n", err_str);
> +        goto free;
> +    }
> +
> +    while (1) {
> +        ret = qb_info_image_static_get(broker, qbs, &info_st);
> +        if (ret < 0) {
> +            qb_error_get_human_str(broker, err_str, sizeof(err_str));
> +            printf("info get error. %s.\n", err_str);
> +            goto close;
> +        }
> +        print_info_image_static(info_st);
> +        qb_close(broker, qbs);
> +        if (info_st->backing_loc.prot_type == QB_FMT_NONE) {
> +            break;
> +        }
> +        *ol = info_st->backing_loc;
> +        ret = qb_open(broker, qbs, ol, of, flag);
> +        if (ret < 0) {
> +            qb_error_get_human_str(broker, err_str, sizeof(err_str));
> +            printf("info getting, open failed in backing file. %s.\n",
> +                                                       err_str);
> +            goto free;
> +        }
> +        qb_info_image_static_delete(broker, &info_st);
> +    }
> +    /* read and write the image */
> +    ol->prot_type = QB_PROTO_FILE;
> +    ol->prot_op.o_file.filename = filename1;
> +    of->fmt_type = QB_FMT_NONE;
> +    flag = LIBQBLOCK_O_RDWR;
> +    ret = qb_open(broker, qbs, ol, of, flag);
> +    if (ret < 0) {
> +        qb_error_get_human_str(broker, err_str, sizeof(err_str));
> +        printf("open failed. %s.\n", err_str);
> +        goto free;
> +    }
> +
> +    buf_w[24] = 3;
> +    memset(buf_r, 0, sizeof(buf_r));
> +
> +    ret = qb_write(broker, qbs, buf_w, test_len, test_offset);
> +    if (ret < 0) {
> +        qb_error_get_human_str(broker, err_str, sizeof(err_str));
> +        printf("%s.\n", err_str);
> +        goto close;
> +    }
> +
> +    ret = qb_read(broker, qbs, buf_r, test_len, test_offset);
> +    if (ret < 0) {
> +        qb_error_get_human_str(broker, err_str, sizeof(err_str));
> +        printf("%s.\n", err_str);
> +        goto close;
> +    }
> +
> +    test_check(&vdata);
> +
> + close:
> +    qb_close(broker, qbs);
> + unlink:
> +    unlink(filename1);
> +    unlink(filename2);
> + free:
> +    if (info_st != NULL) {
> +        qb_info_image_static_delete(broker, &info_st);
> +    }
> +    if (qbs != NULL) {
> +        qb_state_delete(broker, &qbs);
> +    }
> +    if (ol != NULL) {
> +        qb_ol_delete(broker, &ol);
> +    }
> +    if (of != NULL) {
> +        qb_of_delete(broker, &of);
> +    }
> +    if (broker != NULL) {
> +        qb_broker_delete(&broker);
> +    }
> +    return 0;
> +}
> --
> 1.7.1
>
>
>

  reply	other threads:[~2012-09-03 19:27 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-03  9:18 [Qemu-devel] [PATCH 0/6] libqblock, qemu block layer library Wenchao Xia
2012-09-03  9:18 ` [Qemu-devel] [PATCH 1/6] libqblock APIs Wenchao Xia
2012-09-03 13:18   ` Paolo Bonzini
2012-09-04  3:15     ` Wenchao Xia
2012-09-04  6:50       ` Paolo Bonzini
2012-09-04  9:05         ` Wenchao Xia
2012-09-10  8:10         ` Wenchao Xia
2012-09-03 13:56   ` Eric Blake
2012-09-03 14:05     ` Paolo Bonzini
2012-09-04  7:05       ` Wenchao Xia
2012-09-04  7:29         ` Paolo Bonzini
2012-09-04  6:42     ` Wenchao Xia
2012-09-04 11:35       ` Eric Blake
2012-09-04 13:47         ` Paolo Bonzini
2012-09-03 19:22   ` Blue Swirl
2012-09-03  9:18 ` [Qemu-devel] [PATCH 2/6] libqblock public type defines Wenchao Xia
2012-09-03 13:13   ` Paolo Bonzini
2012-09-04  2:00     ` Wenchao Xia
2012-09-03 14:20   ` Eric Blake
2012-09-04  7:10     ` Wenchao Xia
2012-09-04  7:37       ` Paolo Bonzini
2012-09-03 19:31   ` Blue Swirl
2012-09-04  7:19     ` Wenchao Xia
2012-09-04  7:38       ` Paolo Bonzini
2012-09-04 19:22         ` Blue Swirl
2012-09-10  8:22           ` Wenchao Xia
2012-09-03  9:18 ` [Qemu-devel] [PATCH 3/6] libqblock error handling Wenchao Xia
2012-09-03 14:22   ` Eric Blake
2012-09-04  7:12     ` Wenchao Xia
2012-09-10  8:20     ` Wenchao Xia
2012-09-03  9:18 ` [Qemu-devel] [PATCH 4/6] libqblock internal used functions Wenchao Xia
2012-09-03 13:18   ` Paolo Bonzini
2012-09-04  3:19     ` Wenchao Xia
2012-09-03 14:28   ` Eric Blake
2012-09-03 15:18     ` Paolo Bonzini
2012-09-04  7:15       ` Wenchao Xia
2012-09-04  7:38         ` Paolo Bonzini
2012-09-04 11:38         ` Eric Blake
2012-09-04 13:49           ` Paolo Bonzini
2012-09-04 13:51             ` Kevin Wolf
2012-09-10  8:23               ` Wenchao Xia
2012-09-03  9:18 ` [Qemu-devel] [PATCH 5/6] libqblock test example Wenchao Xia
2012-09-03 19:27   ` Blue Swirl [this message]
2012-09-03  9:18 ` [Qemu-devel] [PATCH 6/6] libqblock building system Wenchao Xia
2012-09-03 13:10   ` [Qemu-devel] xbzrle migration cache size advise for high memory changes workload ? Alexandre DERUMIER
2012-09-04 14:05     ` Orit Wasserman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAAu8pHtpnF8uyy55RqqAk2jOLbb7+9YBYRJiWZhEgjNmaUF3LQ@mail.gmail.com \
    --to=blauwirbel@gmail.com \
    --cc=aliguori@us.ibm.com \
    --cc=eblake@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@gmail.com \
    --cc=xiawenc@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.