[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [qemu-devel] [PATCH V2 0/3] [RFC] libqblock draft code
From: |
Blue Swirl |
Subject: |
Re: [Qemu-devel] [qemu-devel] [PATCH V2 0/3] [RFC] libqblock draft code v2 |
Date: |
Mon, 13 Aug 2012 20:00:49 +0000 |
On Mon, Aug 13, 2012 at 11:27 AM, Wenchao Xia
<address@hidden> wrote:
> 于 2012-8-11 20:18, Blue Swirl 写道:
>
>> On Fri, Aug 10, 2012 at 8:04 AM, Wenchao Xia <address@hidden>
>> wrote:
>>>
>>> Thanks for your review, sorry I have forgot some fixing you
>>> mentioned before, will correct them this time.
>>>
>>> 于 2012-8-10 1:12, Blue Swirl 写道:
>>>
>>>> On Thu, Aug 9, 2012 at 10:10 AM, Wenchao Xia
>>>> <address@hidden>
>>>> wrote:
>>>>>
>>>>>
>>>>> This patch intrudce libqblock API, libqblock-test is used as a test
>>>>> case.
>>>>>
>>>>> V2:
>>>>> Using struct_size and [xxx]_new [xxx]_free to keep ABI.
>>>>> Using embbed structure to class format options in image creating.
>>>>> Format specific options were brought to surface.
>>>>> Image format was changed to enum interger instead of string.
>>>>> Some API were renamed.
>>>>> Internel error with errno was saved and with an API caller can get
>>>>> it.
>>>>> ALL flags used were defined in libqblock.h.
>>>>>
>>>>> Something need discuss:
>>>>> Embbed structure or union could make the model more friendly, but
>>>>> that
>>>>> make ABI more difficult, because we need to check every embbed
>>>>> structure's
>>>>> size and guess compiler's memory arrangement. This means #pragma
>>>>> pack(4)
>>>>> or struct_size, offset_next in every structure. Any better way to solve
>>>>> it?
>>>>> or make every structure a plain one?
>>>>
>>>>
>>>>
>>>> I'd still use accessor functions instead of structure passing, it
>>>> would avoid these problems.
>>>>
>>> Do you mean some function like :
>>> CreateOption_Filename_Set(const char *filename)
>>> CreateOption_Format_Set(const char *filename)
>>
>>
>> Something like this:
>> int qb_create_cow(struct QBlockState *qbs, const char *filename,
>> size_t virt_size, const char *backing_file, int backing_flag);
>> etc. for rest of the formats.
>>
>> Alternatively, we could have more generic versions like you describe,
>> or even more generic still:
>>
>> void qb_set_property(struct QBlockState *qbs, const char *prop_name,
>> const char *prop_value);
>>
>> so the create sequence (ignoring error handling) would be:
>> s = qb_init();
>> qb_set_property(s, "filename", "c:\\\\autoexec.bat");
>> qb_set_property(s, "format", "cow");
>> qb_set_property(s, "virt_size", "10GB");
>> // use defaults for backing_file and backing_flag
>> qb_create(s);
>>
>> Likewise for info structure:
>> char *qb_get_property(struct QBlockState *qbs, const char *prop_name);
>>
>> foo = qb_get_property(s, "format");
>> foo = qb_get_property(s, "encrypted");
>> foo = qb_get_property(s, "num_backing_files");
>> foo = qb_get_property(s, "virt_size");
>>
>> This would be helpful for the client to display parameters without
>> much understanding of their contents:
>> char **qb_list_properties(struct QBlockState *qbs); /* returns array
>> of property names available for this file, use get_property to
>> retrieve their contents */
>>
>> But the clients can't be completely ignorant of all formats available,
>> for example a second UI dialog needs to be added for formats with
>> backing files, otherwise it won't be able to access some files at all.
>> Maybe by adding type descriptions for each property (type for
>> "filename" is "path", for others "string", "bool", "enum" etc).
>>
> Thanks. This seems heavy document is needed for that no structure
> can indicate what options sub format have, user can only get that info
> from returns or documents. I am not sure if this is good, because it
> looks more like a object oriented API that C.
This approach may be a bit over-engineered, but it may be simpler to
tie to an UI.
What do you think of the simple version then:
int qb_create_cow(struct QBlockState *qbs, const char *filename,
size_t virt_size, const char *backing_file, int backing_flag);
>
>
>
>>>
>>> It can solve the issue, with a cost of more small APIs in header
>>> files that user should use. Not sure if there is a good way to make
>>> it more friendly as an object language:
>>> "oc.filename = name;" automatically call CreateOption_Filename_Set,
>>> API CreateOption_Filename_Set is invisible to user.
>>>
>>>
>>>
>>>> Packing can even introduce a new set of problems since we don't
>>>> control the CFLAGS of the client of the library.
>>>
>>>
>>>
>>> indeed, I tried to handle the difference in function qboo_adjust_o2n,
>>> found that structure member alignment is hard to deal.
>>>
>>>
>>>>> AIO is missing, need a prototype.
>>>>>
>>>>> Wenchao Xia (3):
>>>>> adding libqblock
>>>>> libqblock API
>>>>> libqblock test case
>>>>>
>>>>> Makefile | 3 +
>>>>> block.c | 2 +-
>>>>> block.h | 1 +
>>>>> libqblock-test.c | 197 ++++++++++++++++
>>>>> libqblock.c | 670
>>>>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>>> libqblock.h | 447 ++++++++++++++++++++++++++++++++++++
>>>>> 6 files changed, 1319 insertions(+), 1 deletions(-)
>>>>> create mode 100644 libqblock-test.c
>>>>> create mode 100644 libqblock.c
>>>>> create mode 100644 libqblock.h
>>>>>
>>>>>
>>>>>
>>>>
>>>
>>>
>>> --
>>> Best Regards
>>>
>>> Wenchao Xia
>>>
>>
>
>
> --
> Best Regards
>
> Wenchao Xia
>