qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-block] [PATCH v7 31/39] blockdev: Add blockdev-insert-medium


From: Alberto Garcia
Subject: Re: [Qemu-block] [PATCH v7 31/39] blockdev: Add blockdev-insert-medium
Date: Wed, 21 Oct 2015 13:49:14 +0200
User-agent: Notmuch/0.13.2 (http://notmuchmail.org) Emacs/23.2.1 (i486-pc-linux-gnu)

On Mon 19 Oct 2015 05:53:37 PM CEST, Max Reitz wrote:
> And a helper function for that, which directly takes a pointer to the
> BDS to be inserted instead of its node-name (which will be used for
> implementing 'change' using blockdev-insert-medium).

Shouldn't this update bdrv_states?

Consider this scenario:

1) We add a drive and eject its BDS
   { "execute": "blockdev-add", "arguments": {
         "options": { "driver": "qcow2",
                      "file": { "driver": "file",
                                "filename": "/tmp/hd0.img"},
                      "id": "drive0" }}}

   { "execute": "eject", "arguments": {"device": "drive0"}}

2) We create a new BDS and insert it in drive0
   { "execute": "blockdev-add", "arguments": {
         "options": { "driver": "qcow2",
                      "file": { "driver": "file",
                                "filename": "/tmp/hd0.img"},
                      "node-name": "hd0" }}}

   { "execute": "blockdev-insert-medium", "arguments": {
         "device": "drive0",
         "node-name": "hd0" }}

3) Now we try to create a snapshot...

   { "execute": "blockdev-snapshot-sync", "arguments": {
         "device": "drive0",
         "snapshot-file": "/tmp/new.img",
         "format": "qcow2" }}

   {"error": {"class": "GenericError",
              "desc": "The feature 'snapshot' is not enabled"}}

   Ooops! It seems that this is because the new node hd0 is not in the
   bdrv_states list.

4) Let's try to create a mirror instead

   { "execute": "drive-mirror", "arguments": {
         "device": "drive0",
         "target": "/tmp/new.img",
         "sync": "top"}}

   {"return": {}}
   {"timestamp": {"seconds": 1445427560,
                  "microseconds": 765993},
    "event": "BLOCK_JOB_READY",
    "data": {"device": "drive0",
             "len": 0,
             "offset": 0,
             "speed": 0,
             "type": "mirror"}}

5) Ok, the block job is ready, so let's complete it:

   { "execute": "query-block-jobs" }
   {"return": []}

   Ooops! Again, hd0 is not in bdrv_states so QEMU cannot find the block
   job.

6) Anyway, we only need the backend name in order to complete a block
   job, so surely we can do it even if it's not in the list:

   { "execute": "block-job-complete", "arguments": {
         "device": "drive0"}}

   Segmentation fault

   That's QTAILQ_INSERT_BEFORE() in change_parent_backing_link(). This
   code assumes that since the 'from' BDS is attached to a backend, it
   must also be in bdrv_states.

Berto



reply via email to

[Prev in Thread] Current Thread [Next in Thread]