From: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
To: quintela@redhat.com
Cc: kwolf@redhat.com, aliguori@us.ibm.com, stefanha@gmail.com,
qemu-devel@nongnu.org, blauwirbel@gmail.com, pbonzini@redhat.com,
Dietmar Maurer <dietmar@proxmox.com>
Subject: Re: [Qemu-devel] [PATCH 4/6] snapshot: implemention of common API to take snapshots
Date: Tue, 25 Dec 2012 13:16:05 +0800 [thread overview]
Message-ID: <50D93695.1080406@linux.vnet.ibm.com> (raw)
In-Reply-To: <87zk17jl7g.fsf@elfo.mitica>
>> Every request's handler need to have three function:
>> execution, updating, cancelling. Also another check function
>
> canceling
>
OK.
>> could be provided to check if request is valid before execition.
>> internal snapshot implemention was based on the code from
>> dietmar@proxmox.com.
>>
>> Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
>> Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
>> ---
>> blockdev.c | 515 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>> 1 files changed, 515 insertions(+), 0 deletions(-)
>>
>> diff --git a/blockdev.c b/blockdev.c
>> index 9a05e57..1c38c67 100644
>> --- a/blockdev.c
>> +++ b/blockdev.c
>> @@ -660,6 +660,521 @@ void do_commit(Monitor *mon, const QDict *qdict)
>> }
>> }
>>
>> +/* snapshot functions.
>> + * following are implemention around core struct BlkTransactionStates.
>
> Normally qemu commonts dont' start with one space.
> Same for all comments in the series
>
OK, will watch for it.
>> + * to start, invalidate, cancel the action.
>> + */
>> +
>> +/* Block internal snapshot(qcow2, sheepdog image...) support.
>> + checking and execution was splitted to enable a check for every device
>> +before execution in group case. */
>> +
>> +SNTime get_sn_time(void)
>> +{
>> + SNTime time;
>> + /* is uint32_t big enough to get time_t value on other machine ? */
>> +#ifdef _WIN32
>> + struct _timeb tb;
>> + _ftime(&tb);
>> + time.date_sec = tb.time;
>> + time.date_nsec = tb.millitm * 1000000;
>> +#else
>> + struct timeval tv;
>> + gettimeofday(&tv, NULL);
>> + time.date_sec = tv.tv_sec;
>> + time.date_nsec = tv.tv_usec * 1000;
>> +#endif
>
> Can we move this bit of code os-lib-win32.c?
> (yes, the mess already existed before this patch)
>
Sure, that is where it should belong.
>> + time.vm_clock_nsec = qemu_get_clock_ns(vm_clock);
>> + return time;
>> +}
>> +
>> +void generate_sn_name_from_time(SNTime *time, char *time_str, int size)
>> +{
>> +#ifdef _WIN32
>> + time_t t = time->date_sec;
>> + struct tm *ptm = localtime(&t);
>> + strftime(time_str, size, "vm-%Y%m%d%H%M%S", ptm);
>> +#else
>> + /* cast below needed for OpenBSD where tv_sec is still 'long' */
>> + time_t second = time->date_sec;
>> + struct tm tm;
>> + localtime_r((const time_t *)&second, &tm);
>> + strftime(time_str, size, "vm-%Y%m%d%H%M%S", &tm);
>> +#endif
>
> can we use localtime_r() also for windows? We have one implementation
> on os-lib-win32.c? It says that it miss locking, should we look at
> improving it instead?
>
let me have a check.
>> +int add_transaction(BlkTransactionStatesList *list,
>> + BlkTransactionStates *states,
>> + Error **errp)
>> +{
>> + int ret;
>> +
>> + if (states->async) {
>> + abort();
>> + }
>> +
>> + switch (states->st_sync.op) {
>> + case BLK_SN_SYNC_CREATE:
>> + if (states->st_sync.type == BLK_SNAPSHOT_INTERNAL) {
>
> This is spelled:
>
> switch(states-s>st_sync.type) {
> case BLK_SNAPSHOT_INTERNAL:
> .....
> }
>
OK.
>> +int submit_transaction(BlkTransactionStatesList *list, Error **errp)
>> +{
>> + BlkTransactionStates *states = NULL;
>> + int ret = 0;
>> + bool error_set = false;
>> +
>> + /* drain all i/o before any snapshots */
>> + bdrv_drain_all();
>> +
>> + /* step 1, do the action, that is create/delete snapshots in sync case */
>> + QSIMPLEQ_FOREACH(states, list, entry) {
>> + if (states->async) {
>> + abort();
>> + } else {
>> + ret = states->blk_trans_do(states, &states->err);
>> + if (ret < 0) {
>> + if ((!error_set) && (states->err)) {
>
> Parens are not needed here
> if (!error_set && states->err) {
>
OK.
>> + *errp = error_copy(states->err);
>> + error_set = TRUE;
>
> TRUE is a constant, here you want "true" lowercase.
>
OK.
>
>> + }
>> + goto delete_and_fail;
>> + }
>> + }
>> + }
>> +
>> + /* step 2, update emulator */
>> + QSIMPLEQ_FOREACH(states, list, entry) {
>> + if (states->async) {
>> + abort();
>> + } else {
>> + if (states->blk_trans_invalid) {
>> + ret = states->blk_trans_invalid(states, &states->err);
>> + if (ret < 0) {
>
>> + if ((!error_set) && (states->err)) {
>> + *errp = error_copy(states->err);
>> + error_set = TRUE;
>
> This snip is repeated in all the loops, can't we factor it out?
>
Sure, will sort them out.
--
Best Regards
Wenchao Xia
next prev parent reply other threads:[~2012-12-25 5:16 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-17 6:25 [Qemu-devel] [PATCH 0/6] snapshot: take snapshots in unified way Wenchao Xia
2012-12-17 6:25 ` [Qemu-devel] [PATCH 1/6] snapshot: export function in block.c Wenchao Xia
2012-12-21 18:13 ` Juan Quintela
2012-12-25 4:31 ` Wenchao Xia
2013-01-04 14:49 ` Stefan Hajnoczi
2013-01-05 8:26 ` Wenchao Xia
2013-01-07 16:43 ` Kevin Wolf
2013-01-08 2:25 ` Wenchao Xia
2013-01-08 10:37 ` Kevin Wolf
2013-01-09 4:32 ` Wenchao Xia
2012-12-17 6:25 ` [Qemu-devel] [PATCH 2/6] snapshot: add error set function Wenchao Xia
2012-12-20 21:36 ` Eric Blake
2012-12-21 2:37 ` Wenchao Xia
2013-01-04 14:55 ` Stefan Hajnoczi
2013-01-05 8:27 ` Wenchao Xia
2012-12-17 6:25 ` [Qemu-devel] [PATCH 3/6] snapshot: design of common API to take snapshots Wenchao Xia
2012-12-21 18:48 ` Eric Blake
2012-12-25 5:25 ` Wenchao Xia
2012-12-21 18:49 ` Juan Quintela
2012-12-25 5:24 ` Wenchao Xia
2012-12-17 6:25 ` [Qemu-devel] [PATCH 4/6] snapshot: implemention " Wenchao Xia
2012-12-17 6:36 ` Dietmar Maurer
2012-12-17 7:38 ` Wenchao Xia
2012-12-17 7:52 ` Dietmar Maurer
2012-12-17 8:52 ` Wenchao Xia
2012-12-17 9:58 ` Dietmar Maurer
2012-12-20 22:19 ` Eric Blake
2012-12-21 3:01 ` Wenchao Xia
2012-12-21 6:20 ` Dietmar Maurer
2013-01-04 16:13 ` Stefan Hajnoczi
2012-12-17 10:32 ` Dietmar Maurer
2012-12-18 10:29 ` Wenchao Xia
2012-12-18 10:36 ` Dietmar Maurer
2012-12-19 3:34 ` Wenchao Xia
2012-12-19 4:55 ` Dietmar Maurer
2012-12-19 5:37 ` Wenchao Xia
2012-12-21 18:48 ` Juan Quintela
2012-12-25 5:16 ` Wenchao Xia [this message]
2012-12-17 6:25 ` [Qemu-devel] [PATCH 5/6] snapshot: qmp interface Wenchao Xia
2013-01-02 14:52 ` Eric Blake
2013-01-04 6:02 ` Wenchao Xia
2013-01-04 13:57 ` Eric Blake
2013-01-04 16:22 ` Stefan Hajnoczi
2013-01-05 8:38 ` Wenchao Xia
2012-12-17 6:25 ` [Qemu-devel] [PATCH 6/6] snapshot: human monitor interface Wenchao Xia
2013-01-04 15:44 ` Stefan Hajnoczi
2013-01-05 8:36 ` 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=50D93695.1080406@linux.vnet.ibm.com \
--to=xiawenc@linux.vnet.ibm.com \
--cc=aliguori@us.ibm.com \
--cc=blauwirbel@gmail.com \
--cc=dietmar@proxmox.com \
--cc=kwolf@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=stefanha@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).