From: Paolo Bonzini <pbonzini@redhat.com>
To: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
Cc: kwolf@redhat.com, peter.maydell@linaro.org, aliguori@us.ibm.com,
stefanha@gmail.com, qemu-devel@nongnu.org, blauwirbel@gmail.com,
kraxel@redhat.com
Subject: Re: [Qemu-devel] [PATCH V10 5/7] libqblock type defines
Date: Tue, 20 Nov 2012 11:30:29 +0100 [thread overview]
Message-ID: <50AB5BC5.9030605@redhat.com> (raw)
In-Reply-To: <1353404767-4495-6-git-send-email-xiawenc@linux.vnet.ibm.com>
Il 20/11/2012 10:46, Wenchao Xia ha scritto:
> This patch contains type and macro defines used in APIs, one file for public
> usage, one for libqblock internal usage.
Mostly looks good, just a few questions below.
> Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
> ---
> libqblock/libqblock-internal.h | 75 ++++++++++++
> libqblock/libqblock-types.h | 252 ++++++++++++++++++++++++++++++++++++++++
> libqblock/libqblock.c | 6 -
> libqblock/libqblock.h | 1 -
> tests/check-libqblock-qcow2.c | 1 -
> 5 files changed, 327 insertions(+), 8 deletions(-)
> create mode 100644 libqblock/libqblock-internal.h
>
> diff --git a/libqblock/libqblock-internal.h b/libqblock/libqblock-internal.h
> new file mode 100644
> index 0000000..75c0452
> --- /dev/null
> +++ b/libqblock/libqblock-internal.h
> @@ -0,0 +1,75 @@
> +/*
> + * QEMU block layer library
> + *
> + * Copyright IBM, Corp. 2012
> + *
> + * Authors:
> + * Wenchao Xia <xiawenc@linux.vnet.ibm.com>
> + *
> + * This work is licensed under the terms of the GNU LGPL, version 2 or later.
> + * See the COPYING.LIB file in the top-level directory.
> + *
> + */
> +
> +#ifndef LIBQBLOCK_INTERNAL
> +#define LIBQBLOCK_INTERNAL
> +
> +#include "glib.h"
Use <glib.h> please.
> +
> +#include "block.h"
> +#include "block_int.h"
Is block_int.h really needed?
> +#include "libqblock-types.h"
> +
> +/* this file contains defines and types used inside the library. */
> +
> +#define FUNC_FREE(p) g_free((p))
> +#define FUNC_MALLOC(size) g_malloc((size))
> +#define FUNC_CALLOC(nmemb, size) g_malloc0((nmemb)*(size))
> +#define FUNC_STRDUP(p) g_strdup((p))
Why keep these?
> +
> +#define CLEAN_FREE(p) { \
> + FUNC_FREE(p); \
> + (p) = NULL; \
> +}
What about calling it QB_FREE?
> +
> +/* details should be hidden to user */
> +struct QBlockState {
> + BlockDriverState *bdrvs;
> + /* internal used file name now, if it is not NULL, it means
> + image was opened.
> + */
> + char *filename;
> +};
> +
> +struct QBlockContext {
> + /* last error */
> + GError *g_error;
> + int err_ret; /* 1st level of error, the libqblock error number */
> + int err_no; /* 2nd level of error, errno what below reports */
> +};
> +
> +/**
> + * QBlockStaticInfoAddr: a structure contains a set of pointer.
> + *
> + * this struct contains a set of pointer pointing to some
> + * property related to format or protocol. If a property is not available,
> + * it will be set as NULL. User could use this to get properties directly.
> + *
> + * @virt_size: virtual size, it is always not NULL.
> + * @backing_loc: backing file location.
> + * @encrypt: encryption flag.
> +*/
> +
> +typedef struct QBlockStaticInfoAddr {
> + uint64_t *virt_size;
> + QBlockLocationInfo *backing_loc;
> + bool *encrypt;
> +} QBlockStaticInfoAddr;
> +
> +#define G_LIBQBLOCK_ERROR g_libqbock_error_quark()
> +
> +static inline GQuark g_libqbock_error_quark(void)
libqblock, not libqbock.
> +{
> + return g_quark_from_static_string("g-libqblock-error-quark");
> +}
> +#endif
> diff --git a/libqblock/libqblock-types.h b/libqblock/libqblock-types.h
> index e69de29..77ad325 100644
> --- a/libqblock/libqblock-types.h
> +++ b/libqblock/libqblock-types.h
> @@ -0,0 +1,252 @@
> +/*
> + * QEMU block layer library
> + *
> + * Copyright IBM, Corp. 2012
> + *
> + * Authors:
> + * Wenchao Xia <xiawenc@linux.vnet.ibm.com>
> + *
> + * This work is licensed under the terms of the GNU LGPL, version 2 or later.
> + * See the COPYING.LIB file in the top-level directory.
> + *
> + */
> +
> +#ifndef LIBQBLOCK_TYPES_H
> +#define LIBQBLOCK_TYPES_H
> +
> +#include <sys/types.h>
> +#include <stdint.h>
> +#include <stdbool.h>
> +
> +#if defined(__GNUC__) && __GNUC__ >= 4
> + #ifdef LIBQB_BUILD
> + #define DLL_PUBLIC __attribute__((visibility("default")))
> + #else
> + #define DLL_PUBLIC
> + #endif
> +#endif
> +
> +/* this library is designed around this core struct. */
> +typedef struct QBlockState QBlockState;
> +
> +/* every thread should have a context. */
> +typedef struct QBlockContext QBlockContext;
> +
> +/* flag used in open and create */
> +#define LIBQBLOCK_O_RDWR 0x0002
> +/* do not use the host page cache */
> +#define LIBQBLOCK_O_NOCACHE 0x0020
> +/* use write-back caching */
> +#define LIBQBLOCK_O_CACHE_WB 0x0040
> +/* don't open the backing file */
> +#define LIBQBLOCK_O_NO_BACKING 0x0100
> +/* disable flushing on this disk */
> +#define LIBQBLOCK_O_NO_FLUSH 0x0200
> +
> +#define LIBQBLOCK_O_CACHE_MASK \
> + (LIBQBLOCK_O_NOCACHE | LIBQBLOCK_O_CACHE_WB | LIBQBLOCK_O_NO_FLUSH)
> +
> +#define LIBQBLOCK_O_VALID_MASK \
> + (LIBQBLOCK_O_RDWR | LIBQBLOCK_O_NOCACHE | LIBQBLOCK_O_CACHE_WB | \
> + LIBQBLOCK_O_NO_BACKING | LIBQBLOCK_O_NO_FLUSH)
> +
> +typedef enum QBlockProtocol {
> + QB_PROTO_NONE = 0,
> + QB_PROTO_FILE,
> + QB_PROTO_MAX
> +} QBlockProtocol;
> +
> +typedef struct QBlockProtocolOptionsFile {
> + const char *filename;
> +} QBlockProtocolOptionsFile;
> +
> +/**
> + * struct QBlockLocationInfo: contains information about how to find the image
> + *
> + * @prot_type: protocol type, now only support FILE.
> + * @o_file: file protocol related attributes.
> + * @reserved: reserved bytes for ABI.
> + */
> +#define QBLOCK_PROT_OPTIONS_UNION_SIZE (512)
> +typedef struct QBlockLocationInfo {
> + QBlockProtocol prot_type;
> + union {
> + QBlockProtocolOptionsFile o_file;
> + uint64_t reserved[QBLOCK_PROT_OPTIONS_UNION_SIZE/8];
> + };
> +} QBlockLocationInfo;
> +
> +
> +/* format related options */
> +typedef enum QBlockFormat {
> + QB_FMT_NONE = 0,
> + QB_FMT_COW,
> + QB_FMT_QED,
> + QB_FMT_QCOW,
> + QB_FMT_QCOW2,
> + QB_FMT_RAW,
> + QB_FMT_RBD,
> + QB_FMT_SHEEPDOG,
> + QB_FMT_VDI,
> + QB_FMT_VMDK,
> + QB_FMT_VPC,
> + QB_FMT_MAX
> +} QBlockFormat;
> +
> +typedef struct QBlockFormatOptionsCOW {
> + uint64_t virt_size;
> + QBlockLocationInfo backing_loc;
> +} QBlockFormatOptionsCOW;
> +
> +typedef struct QBlockFormatOptionsQED {
> + uint64_t virt_size;
> + QBlockLocationInfo backing_loc;
> + QBlockFormat backing_fmt;
> + uint64_t cluster_size; /* unit is bytes */
> + uint64_t table_size; /* unit is clusters */
> +} QBlockFormatOptionsQED;
> +
> +typedef struct QBlockFormatOptionsQCOW {
> + uint64_t virt_size;
> + QBlockLocationInfo backing_loc;
> + bool encrypt;
> +} QBlockFormatOptionsQCOW;
> +
> +/* "Compatibility level (0.10 or 1.1)" */
> +typedef enum QBlockFormatOptionsQCOW2CompatLv {
> + QB_FMT_QCOW2_COMPAT_DEFAULT = 0,
> + QB_FMT_QCOW2_COMPAT_V0_10,
> + QB_FMT_QCOW2_COMPAT_V1_10,
> +} QBlockFormatOptionsQCOW2CompatLv;
> +
> +/* off or metadata */
> +typedef enum QBlockFormatOptionsQCOW2PreAlloc {
> + QB_FMT_QCOW2_PREALLOC_DEFAULT = 0,
> + QB_FMT_QCOW2_PREALLOC_OFF,
> + QB_FMT_QCOW2_PREALLOC_METADATA,
> +} QBlockFormatOptionsQCOW2PreAlloc;
> +
> +typedef struct QBlockFormatOptionsQCOW2 {
> + uint64_t virt_size;
> + QBlockLocationInfo backing_loc;
> + QBlockFormat backing_fmt;
> + bool encrypt;
> + uint64_t cluster_size; /* unit is bytes */
> + QBlockFormatOptionsQCOW2CompatLv cpt_lv;
> + QBlockFormatOptionsQCOW2PreAlloc pre_mode;
> +} QBlockFormatOptionsQCOW2;
> +
> +typedef struct QBlockFormatOptionsRAW {
> + uint64_t virt_size;
> +} QBlockFormatOptionsRAW;
> +
> +typedef struct QBlockFormatOptionsRBD {
> + uint64_t virt_size;
> + uint64_t cluster_size;
> +} QBlockFormatOptionsRBD;
> +
> +/* off or full */
> +typedef enum QBlockFormatOptionsSDPreAlloc {
> + QB_FMT_SD_PREALLOC_DEFAULT = 0,
> + QB_FMT_SD_PREALLOC_OFF,
> + QB_FMT_SD_PREALLOC_FULL,
> +} QBlockFormatOptionsSDPreAlloc;
> +
> +typedef struct QBlockFormatOptionsSD {
> + uint64_t virt_size;
> + QBlockLocationInfo backing_loc;
> + QBlockFormatOptionsSDPreAlloc pre_mode;
> +} QBlockFormatOptionsSD;
> +
> +typedef enum QBlockFormatOptionsVDIPreAlloc {
> + QB_FMT_VDI_PREALLOC_DEFAULT = 0,
> + QB_FMT_VDI_PREALLOC_OFF,
> + QB_FMT_VDI_PREALLOC_METADATA,
> +} QBlockFormatOptionsVDIPreAlloc;
> +
> +typedef struct QBlockFormatOptionsVDI {
> + uint64_t virt_size;
> + uint64_t cluster_size;
> + QBlockFormatOptionsVDIPreAlloc pre_mode;
> +} QBlockFormatOptionsVDI;
> +
> +/* whether compact to vmdk verion 6 */
> +typedef enum QBlockFormatOptionsVMDKCompatLv {
> + QB_FMT_VMDK_COMPAT_DEFAULT = 0,
> + QB_FMT_VMDK_COMPAT_VMDKV6_FALSE,
> + QB_FMT_VMDK_COMPAT_VMDKV6_TRUE,
> +} QBlockFormatOptionsVMDKCompatLv;
> +
> +/* vmdk flat extent format, values:
> +"{monolithicSparse (default) | monolithicFlat | twoGbMaxExtentSparse |
> +twoGbMaxExtentFlat | streamOptimized} */
> +typedef enum QBlockFormatOptionsVMDKSubfmt {
> + QB_FMT_VMDK_SUBFMT_DEFAULT = 0,
> + QB_FMT_VMDK_SUBFMT_MONOLITHIC_SPARSE,
> + QB_FMT_VMDK_SUBFMT_MONOLITHIC_FLAT,
> + QB_FMT_VMDK_SUBFMT_TWOGBMAX_EXTENT_SPARSE,
> + QB_FMT_VMDK_SUBFMT_TWOGBMAX_EXTENT_FLAT,
> + QB_FMT_VMDK_SUBFMT_STREAM_OPTIMIZED,
> +} QBlockFormatOptionsVMDKSubfmt;
> +
> +typedef struct QBlockFormatOptionsVMDK {
> + uint64_t virt_size;
> + QBlockLocationInfo backing_loc;
> + QBlockFormatOptionsVMDKCompatLv cpt_lv;
> + QBlockFormatOptionsVMDKSubfmt subfmt;
> +} QBlockFormatOptionsVMDK;
> +
> +/* "{dynamic (default) | fixed} " */
> +typedef enum QBlockFormatOptionsVPCSubfmt {
> + QB_FMT_VPC_SUBFMT_DEFAULT = 0,
> + QB_FMT_VPC_SUBFMT_DYNAMIC,
> + QB_FMT_VPC_SUBFMT_FIXED,
> +} QBlockFormatOptionsVPCSubfmt;
> +
> +typedef struct QBlockFormatOptionsVPC {
> + uint64_t virt_size;
> + QBlockFormatOptionsVPCSubfmt subfmt;
> +} QBlockFormatOptionsVPC;
> +
> +#define QBLOCK_FMT_OPTIONS_UNION_SIZE (QBLOCK_PROT_OPTIONS_UNION_SIZE*2)
Why?
> +
> +/**
> + * struct QBlockFormatInfo: contains information about how to retrieve data
> + * from the image
> + *
> + * @fmt_type: format type.
> + * @o_cow~@o_vdi: format related attributes.
> + * @reserved: reserved bytes for ABI.
> + */
> +typedef struct QBlockFormatInfo {
> + QBlockFormat fmt_type;
> + union {
> + QBlockFormatOptionsCOW o_cow;
> + QBlockFormatOptionsQED o_qed;
> + QBlockFormatOptionsQCOW o_qcow;
> + QBlockFormatOptionsQCOW2 o_qcow2;
> + QBlockFormatOptionsRAW o_raw;
> + QBlockFormatOptionsRBD o_rbd;
> + QBlockFormatOptionsSD o_sd;
> + QBlockFormatOptionsVDI o_vdi;
> + QBlockFormatOptionsVMDK o_vmdk;
> + QBlockFormatOptionsVPC o_vpc;
> + uint64_t reserved[QBLOCK_FMT_OPTIONS_UNION_SIZE/8];
> + };
> +} QBlockFormatInfo;
> +
> +/**
> + * QBlockStaticInfo: information about the block image.
> + *
> + * @loc: location information.
> + * @fmt: format information.
> + * @sector_size: how many bytes in a sector, it is 512 usually.
> + */
> +typedef struct QBlockStaticInfo {
> + QBlockLocationInfo loc;
> + QBlockFormatInfo fmt;
> + int sector_size;
> +} QBlockStaticInfo;
> +
> +
> +#endif
> diff --git a/libqblock/libqblock.c b/libqblock/libqblock.c
> index 4c18c41..e69de29 100644
> --- a/libqblock/libqblock.c
> +++ b/libqblock/libqblock.c
> @@ -1,6 +0,0 @@
> -#include "libqblock.h"
> -
> -int libqb_test(void)
> -{
> - return 0;
> -}
Why?
> diff --git a/libqblock/libqblock.h b/libqblock/libqblock.h
> index b0f9daf..e69de29 100644
> --- a/libqblock/libqblock.h
> +++ b/libqblock/libqblock.h
> @@ -1 +0,0 @@
> -__attribute__((visibility("default"))) int libqb_test(void);
> diff --git a/tests/check-libqblock-qcow2.c b/tests/check-libqblock-qcow2.c
> index 50a4df3..6f5ccac 100644
> --- a/tests/check-libqblock-qcow2.c
> +++ b/tests/check-libqblock-qcow2.c
> @@ -1,6 +1,5 @@
> #include "libqblock.h"
> int main(int argc, char **argv)
> {
> - libqb_test();
Why?
> return 0;
> }
>
next prev parent reply other threads:[~2012-11-20 10:31 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-20 9:46 [Qemu-devel] [PATCH V10 0/7] libqblock qemu block layer library Wenchao Xia
2012-11-20 9:46 ` [Qemu-devel] [PATCH V10 1/7] Buildsystem fix distclean error for pixman Wenchao Xia
2012-11-21 22:54 ` Peter Maydell
2012-11-22 1:50 ` Wenchao Xia
2012-11-20 9:46 ` [Qemu-devel] [PATCH V10 2/7] Buildsystem clean tests directory clearly Wenchao Xia
2012-11-20 9:46 ` [Qemu-devel] [PATCH V10 3/7] block export function path_has_protocol Wenchao Xia
2012-11-20 9:46 ` [Qemu-devel] [PATCH V10 4/7] libqblock build system Wenchao Xia
2012-11-20 10:26 ` Paolo Bonzini
2012-11-21 3:03 ` Wenchao Xia
2012-11-21 7:56 ` Paolo Bonzini
2012-11-22 1:47 ` Wenchao Xia
2012-11-20 9:46 ` [Qemu-devel] [PATCH V10 5/7] libqblock type defines Wenchao Xia
2012-11-20 10:30 ` Paolo Bonzini [this message]
2012-11-21 3:12 ` Wenchao Xia
2012-11-21 8:05 ` Paolo Bonzini
2012-11-22 1:50 ` Wenchao Xia
2012-11-20 9:46 ` [Qemu-devel] [PATCH V10 6/7] libqblock API Wenchao Xia
2012-11-20 10:41 ` Paolo Bonzini
2012-11-21 3:40 ` Wenchao Xia
2012-11-21 8:04 ` Paolo Bonzini
2012-11-22 1:48 ` Wenchao Xia
2012-11-20 9:46 ` [Qemu-devel] [PATCH V10 7/7] libqblock test example Wenchao Xia
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=50AB5BC5.9030605@redhat.com \
--to=pbonzini@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=blauwirbel@gmail.com \
--cc=kraxel@redhat.com \
--cc=kwolf@redhat.com \
--cc=peter.maydell@linaro.org \
--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.