From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:57516) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TBj9a-0002Z4-LX for qemu-devel@nongnu.org; Wed, 12 Sep 2012 05:22:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TBj9Y-0000Ox-NR for qemu-devel@nongnu.org; Wed, 12 Sep 2012 05:22:38 -0400 Received: from e23smtp05.au.ibm.com ([202.81.31.147]:52271) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TBj9Y-0000Om-50 for qemu-devel@nongnu.org; Wed, 12 Sep 2012 05:22:36 -0400 Received: from /spool/local by e23smtp05.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 12 Sep 2012 19:21:30 +1000 Received: from d23av04.au.ibm.com (d23av04.au.ibm.com [9.190.235.139]) by d23relay05.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q8C9DBJX18153704 for ; Wed, 12 Sep 2012 19:13:12 +1000 Received: from d23av04.au.ibm.com (loopback [127.0.0.1]) by d23av04.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q8C9MRG1010238 for ; Wed, 12 Sep 2012 19:22:28 +1000 Message-ID: <50505400.4000300@linux.vnet.ibm.com> Date: Wed, 12 Sep 2012 17:21:04 +0800 From: Wenchao Xia MIME-Version: 1.0 References: <1347265586-17698-1-git-send-email-xiawenc@linux.vnet.ibm.com> <1347265586-17698-2-git-send-email-xiawenc@linux.vnet.ibm.com> <505045AA.2070705@redhat.com> In-Reply-To: <505045AA.2070705@redhat.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH V2 1/6] libqblock API design List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Kevin Wolf Cc: aliguori@us.ibm.com, stefanha@gmail.com, qemu-devel@nongnu.org, Blue Swirl , pbonzini@redhat.com, eblake@redhat.com 于 2012-9-12 16:19, Kevin Wolf 写道: > Am 11.09.2012 22:28, schrieb Blue Swirl: >> On Mon, Sep 10, 2012 at 8:26 AM, Wenchao Xia wrote: >>> This patch contains the major APIs in the library. >>> Important APIs: >>> 1 QBroker. These structure was used to retrieve errors, every thread must >>> create one first, later maybe thread related staff could be added into it. >>> 2 QBlockState. It stands for an block image object. >>> 3 QBlockStaticInfo. It contains static information such as location, backing >>> file, size. >>> 4 ABI was kept with reserved members. >>> 5 Sync I/O. It is similar to C file open, read, write and close operations. >>> >>> Signed-off-by: Wenchao Xia >>> --- >>> libqblock/libqblock.c | 1077 +++++++++++++++++++++++++++++++++++++++++++++++++ >>> libqblock/libqblock.h | 292 +++++++++++++ >>> 2 files changed, 1369 insertions(+), 0 deletions(-) >>> create mode 100644 libqblock/libqblock.c >>> create mode 100644 libqblock/libqblock.h >>> >>> diff --git a/libqblock/libqblock.c b/libqblock/libqblock.c >>> new file mode 100644 >>> index 0000000..133ac0f >>> --- /dev/null >>> +++ b/libqblock/libqblock.c >>> @@ -0,0 +1,1077 @@ >>> +/* >>> + * QEMU block layer library >>> + * >>> + * Copyright IBM, Corp. 2012 >>> + * >>> + * Authors: >>> + * Wenchao Xia >>> + * >>> + * 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. >>> + * >>> + */ >>> + >>> +#include >>> +#include >>> + >>> +#include "libqblock.h" >>> +#include "libqblock-internal.h" >>> + >>> +#include "qemu-aio.h" >>> + >>> +struct LibqblockGlobalData { >>> + int init_flag; >>> +}; >>> + >>> +struct LibqblockGlobalData g_libqblock_data; >>> + >>> +__attribute__((constructor)) >>> +static void libqblock_init(void) >>> +{ >>> + if (g_libqblock_data.init_flag == 0) { >>> + bdrv_init(); >>> + qemu_init_main_loop(); >>> + } >>> + g_libqblock_data.init_flag = 1; >>> +} >>> + >>> +const char *qb_fmttype2str(enum QBlockFmtType fmt_type) >>> +{ >>> + const char *ret = NULL; >>> + switch (fmt_type) { >>> + case QB_FMT_COW: >>> + ret = "cow"; >>> + break; >>> + case QB_FMT_QED: >>> + ret = "qed"; >>> + break; >>> + case QB_FMT_QCOW: >>> + ret = "qcow"; >>> + break; >>> + case QB_FMT_QCOW2: >>> + ret = "qcow2"; >>> + break; >>> + case QB_FMT_RAW: >>> + ret = "raw"; >>> + break; >>> + case QB_FMT_RBD: >>> + ret = "rbd"; >>> + break; >>> + case QB_FMT_SHEEPDOG: >>> + ret = "sheepdog"; >>> + break; >>> + case QB_FMT_VDI: >>> + ret = "vdi"; >>> + break; >>> + case QB_FMT_VMDK: >>> + ret = "vmdk"; >>> + break; >>> + case QB_FMT_VPC: >>> + ret = "vpc"; >>> + break; >>> + default: >>> + break; >>> + } >>> + return ret; >>> +} >>> + >>> +enum QBlockFmtType qb_str2fmttype(const char *fmt_str) >>> +{ >>> + enum QBlockFmtType ret = QB_FMT_NONE; >>> + if (0 == strcmp(fmt_str, "cow")) { >> >> This order is not common in QEMU. > > How about just changing the whole thing to a table that maps > QBlockFmtType to strings, and then both conversion functions could just > search that table? > Good idea, will go this way. >> >>> + ret = QB_FMT_COW; >>> + } else if (0 == strcmp(fmt_str, "qed")) { >>> + ret = QB_FMT_QED; >>> + } else if (0 == strcmp(fmt_str, "qcow")) { >>> + ret = QB_FMT_QCOW; >>> + } else if (0 == strcmp(fmt_str, "qcow2")) { >>> + ret = QB_FMT_QCOW2; >>> + } else if (0 == strcmp(fmt_str, "raw")) { >>> + ret = QB_FMT_RAW; >>> + } else if (0 == strcmp(fmt_str, "rbd")) { >>> + ret = QB_FMT_RBD; >>> + } else if (0 == strcmp(fmt_str, "sheepdog")) { >>> + ret = QB_FMT_SHEEPDOG; >>> + } else if (0 == strcmp(fmt_str, "vdi")) { >>> + ret = QB_FMT_VDI; >>> + } else if (0 == strcmp(fmt_str, "vmdk")) { >>> + ret = QB_FMT_VMDK; >>> + } else if (0 == strcmp(fmt_str, "vpc")) { >>> + ret = QB_FMT_VPC; >>> + } >>> + return ret; >>> +} > > Kevin > -- Best Regards Wenchao Xia