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 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.