qemu-block
[Top][All Lists]
Advanced

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

[BUG, RFC] Base node is in RW after making external snapshot


From: Andrey Drobyshev
Subject: [BUG, RFC] Base node is in RW after making external snapshot
Date: Wed, 24 Apr 2024 21:00:08 +0300
User-agent: Mozilla Thunderbird

Hi everyone,

When making an external snapshot, we end up in a situation when 2 block
graph nodes related to the same image file (format and storage nodes)
have different RO flags set on them.

E.g.

# ls -la /proc/PID/fd
lrwx------ 1 root qemu 64 Apr 24 20:14 12 -> /path/to/harddisk.hdd

# virsh qemu-monitor-command VM '{"execute": "query-named-block-nodes"}'
--pretty | egrep '"node-name"|"ro"'
      "ro": false,
      "node-name": "libvirt-1-format",
      "ro": false,
      "node-name": "libvirt-1-storage",

# virsh snapshot-create-as VM --name snap --disk-only
Domain snapshot snap created

# ls -la /proc/PID/fd
lr-x------ 1 root qemu 64 Apr 24 20:14 134 -> /path/to/harddisk.hdd
lrwx------ 1 root qemu 64 Apr 24 20:14 135 -> /path/to/harddisk.snap

# virsh qemu-monitor-command VM '{"execute": "query-named-block-nodes"}'
--pretty | egrep '"node-name"|"ro"'
      "ro": false,
      "node-name": "libvirt-2-format",
      "ro": false,
      "node-name": "libvirt-2-storage",
      "ro": true,
      "node-name": "libvirt-1-format",
      "ro": false,                        <--------------
      "node-name": "libvirt-1-storage",

File descriptor has been reopened in RO, but "libvirt-1-storage" node
still has RW permissions set.

I'm wondering it this a bug or this is intended?  Looks like a bug to
me, although I see that some iotests (e.g. 273) expect 2 nodes related
to the same image file to have different RO flags.

bdrv_reopen_set_read_only()
  bdrv_reopen()
    bdrv_reopen_queue()
      bdrv_reopen_queue_child()
    bdrv_reopen_multiple()
      bdrv_list_refresh_perms()
        bdrv_topological_dfs()
        bdrv_do_refresh_perms()
      bdrv_reopen_commit()

In the stack above bdrv_reopen_set_read_only() is only being called for
the parent (libvirt-1-format) node.  There're 2 lists: BDSs from
refresh_list are used by bdrv_drv_set_perm and this leads to actual
reopen with RO of the file descriptor.  And then there's reopen queue
bs_queue -- BDSs from this queue get their parameters updated.  While
refresh_list ends up having the whole subtree (including children, this
is done in bdrv_topological_dfs()) bs_queue only has the parent.  And
that is because storage (child) node's (bs->inherits_from == NULL), so
bdrv_reopen_queue_child() never adds it to the queue.  Could it be the
source of this bug?

Anyway, would greatly appreciate a clarification.

Andrey



reply via email to

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