Patchwork [03/18] Introduce skip_header parameter to qemu_loadvm_state().

login
register
mail settings
Submitter Yoshiaki Tamura
Date Feb. 23, 2011, 1:48 p.m.
Message ID <1298468927-19193-4-git-send-email-tamura.yoshiaki@lab.ntt.co.jp>
Download mbox | patch
Permalink /patch/84144/
State New
Headers show

Comments

Yoshiaki Tamura - Feb. 23, 2011, 1:48 p.m.
Introduce skip_header parameter to qemu_loadvm_state() so that it can
be called iteratively without reading the header.

Signed-off-by: Yoshiaki Tamura <tamura.yoshiaki@lab.ntt.co.jp>
---
 migration.c |    2 +-
 savevm.c    |   24 +++++++++++++-----------
 sysemu.h    |    2 +-
 3 files changed, 15 insertions(+), 13 deletions(-)
Juan Quintela - Feb. 23, 2011, 10 p.m.
Yoshiaki Tamura <tamura.yoshiaki@lab.ntt.co.jp> wrote:
> Introduce skip_header parameter to qemu_loadvm_state() so that it can
> be called iteratively without reading the header.
>
> Signed-off-by: Yoshiaki Tamura <tamura.yoshiaki@lab.ntt.co.jp>
> ---
>  migration.c |    2 +-
>  savevm.c    |   24 +++++++++++++-----------
>  sysemu.h    |    2 +-
>  3 files changed, 15 insertions(+), 13 deletions(-)
>
> diff --git a/migration.c b/migration.c
> index 302b8fe..bd51fef 100644
> --- a/migration.c
> +++ b/migration.c
> @@ -63,7 +63,7 @@ int qemu_start_incoming_migration(const char *uri)
>  
>  void process_incoming_migration(QEMUFile *f)
>  {
> -    if (qemu_loadvm_state(f) < 0) {
> +    if (qemu_loadvm_state(f, 0) < 0) {
>          fprintf(stderr, "load of migration failed\n");
>          exit(0);
>      }

I think it would be better to just create a different function

qemu_loadvm_state_internal() (better name)

and that qemu_loadvm_state() just does the other tests and call
qemu_loadvm_state_internal?


Later, Juan.
Yoshiaki Tamura - Feb. 24, 2011, 2:49 a.m.
Juan Quintela wrote:
> Yoshiaki Tamura<tamura.yoshiaki@lab.ntt.co.jp>  wrote:
>> Introduce skip_header parameter to qemu_loadvm_state() so that it can
>> be called iteratively without reading the header.
>>
>> Signed-off-by: Yoshiaki Tamura<tamura.yoshiaki@lab.ntt.co.jp>
>> ---
>>   migration.c |    2 +-
>>   savevm.c    |   24 +++++++++++++-----------
>>   sysemu.h    |    2 +-
>>   3 files changed, 15 insertions(+), 13 deletions(-)
>>
>> diff --git a/migration.c b/migration.c
>> index 302b8fe..bd51fef 100644
>> --- a/migration.c
>> +++ b/migration.c
>> @@ -63,7 +63,7 @@ int qemu_start_incoming_migration(const char *uri)
>>
>>   void process_incoming_migration(QEMUFile *f)
>>   {
>> -    if (qemu_loadvm_state(f)<  0) {
>> +    if (qemu_loadvm_state(f, 0)<  0) {
>>           fprintf(stderr, "load of migration failed\n");
>>           exit(0);
>>       }
>
> I think it would be better to just create a different function
>
> qemu_loadvm_state_internal() (better name)
>
> and that qemu_loadvm_state() just does the other tests and call
> qemu_loadvm_state_internal?

Sounds reasonable.  Let me try.

Yoshi

>
>
> Later, Juan.
>

Patch

diff --git a/migration.c b/migration.c
index 302b8fe..bd51fef 100644
--- a/migration.c
+++ b/migration.c
@@ -63,7 +63,7 @@  int qemu_start_incoming_migration(const char *uri)
 
 void process_incoming_migration(QEMUFile *f)
 {
-    if (qemu_loadvm_state(f) < 0) {
+    if (qemu_loadvm_state(f, 0) < 0) {
         fprintf(stderr, "load of migration failed\n");
         exit(0);
     }
diff --git a/savevm.c b/savevm.c
index 22010b9..52d5be8 100644
--- a/savevm.c
+++ b/savevm.c
@@ -1716,7 +1716,7 @@  typedef struct LoadStateEntry {
     int version_id;
 } LoadStateEntry;
 
-int qemu_loadvm_state(QEMUFile *f)
+int qemu_loadvm_state(QEMUFile *f, int skip_header)
 {
     QLIST_HEAD(, LoadStateEntry) loadvm_handlers =
         QLIST_HEAD_INITIALIZER(loadvm_handlers);
@@ -1729,17 +1729,19 @@  int qemu_loadvm_state(QEMUFile *f)
         return -EINVAL;
     }
 
-    v = qemu_get_be32(f);
-    if (v != QEMU_VM_FILE_MAGIC)
-        return -EINVAL;
+    if (!skip_header) {
+        v = qemu_get_be32(f);
+        if (v != QEMU_VM_FILE_MAGIC)
+            return -EINVAL;
 
-    v = qemu_get_be32(f);
-    if (v == QEMU_VM_FILE_VERSION_COMPAT) {
-        fprintf(stderr, "SaveVM v2 format is obsolete and don't work anymore\n");
-        return -ENOTSUP;
+        v = qemu_get_be32(f);
+        if (v == QEMU_VM_FILE_VERSION_COMPAT) {
+            fprintf(stderr, "SaveVM v2 format is obsolete and don't work anymore\n");
+            return -ENOTSUP;
+        }
+        if (v != QEMU_VM_FILE_VERSION)
+            return -ENOTSUP;
     }
-    if (v != QEMU_VM_FILE_VERSION)
-        return -ENOTSUP;
 
     while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) {
         uint32_t instance_id, version_id, section_id;
@@ -2062,7 +2064,7 @@  int load_vmstate(const char *name)
         return -EINVAL;
     }
 
-    ret = qemu_loadvm_state(f);
+    ret = qemu_loadvm_state(f, 0);
 
     qemu_fclose(f);
     if (ret < 0) {
diff --git a/sysemu.h b/sysemu.h
index 0a83ab9..8339eb4 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -93,7 +93,7 @@  int qemu_savevm_state_begin(Monitor *mon, QEMUFile *f, int blk_enable,
 int qemu_savevm_state_iterate(Monitor *mon, QEMUFile *f);
 int qemu_savevm_state_complete(Monitor *mon, QEMUFile *f);
 void qemu_savevm_state_cancel(Monitor *mon, QEMUFile *f);
-int qemu_loadvm_state(QEMUFile *f);
+int qemu_loadvm_state(QEMUFile *f, int skip_header);
 
 /* SLIRP */
 void do_info_slirp(Monitor *mon);