[libvirt] [PATCHv2 01/33] qemu: process: Refresh backing chain info when reconnecting to qemu
Eric Blake
eblake at redhat.com
Thu May 22 21:20:47 UTC 2014
On 05/22/2014 07:47 AM, Peter Krempa wrote:
> Refresh the disk backing chains when reconnecting to a qemu process
> after daemon restart. There are a few internal fields that don't get
> refreshed from the XML. Until we are able to do that, let's reload all
> the metadata by the backing chain crawler.
Not necessarily ideal. Reading metadata from a file that is also
simultaneously opened read-write by qemu might, in super-rare
circumstances, hit a race where qemu is in the middle of updating
metadata due to the completion of some job that was started before the
libvirtd restart. Although qcow2 has a hard cap of header fitting in
one cluster (typically 64k) (at least, after CVE-2014-0144, qemu.git
commit 24342f2ca), it is still plausible that qemu is updating the qcow2
header via sectors (perhaps as small as 512-byte chunks) rather than by
full clusters; and there are scenarios where an update touches two
non-adjacent sectors (such as adjusting the backing file name), such
that if a reader sees the old content of one sector but the new content
of the other, then it is completely broken in interpreting the data.
A slightly safer alternative might be using a QMP command to ask qemu
what the backing chain currently is when we reconnect - although that
may require correlation back to filenames we passed in, since in the
face of fd passing, qemu may only know the name "/dev/fdset/NNN" instead
of the filename the earlier libvirtd opened and passed in by fd. And
that presupposes that qemu can always be trusted (we don't want to
introduce a CVE where a guest that compromises qemu into returning bogus
QMP results can then cause libvirt to mismanage the host filesystem).
So with those points made, a metadata read race is extremely rare, and I
see no point in implementing a half-way solution that requires parsing a
QMP command if we are eventually going to switch over to full XML
tracking anyways. Therefore, since _this_ patch is a clear improvement
(even if not theoretically perfect), we shouldn't hold it up waiting for
some other solution.
ACK as-is.
> src/qemu/qemu_process.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index a83780f..4aa9ca3 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -3213,6 +3213,11 @@ qemuProcessReconnect(void *opaque)
> if (qemuTranslateDiskSourcePool(conn, obj->def->disks[i]) < 0)
> goto error;
>
> + /* XXX we should be able to restore all data from XML in the future */
and thanks for the comment to remind us what we should improve.
> + if (qemuDomainDetermineDiskChain(driver, obj,
> + obj->def->disks[i], true) < 0)
> + goto error;
> +
> dev.type = VIR_DOMAIN_DEVICE_DISK;
> dev.data.disk = obj->def->disks[i];
> if (qemuAddSharedDevice(driver, &dev, obj->def->name) < 0)
>
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 604 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140522/9b54cfd3/attachment-0001.sig>
More information about the libvir-list
mailing list