From 3a261ac3fc727657cb1b7dbf849ecbd71a3e38c2 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Tue, 12 Aug 2025 01:09:37 +0300 Subject: [PATCH] Support QEMU 10 --- patches/pve-qemu-10.0-vitastor.patch | 172 +++++++++++++++++++++++++++ patches/qemu-10.0-vitastor.patch | 172 +++++++++++++++++++++++++++ src/client/qemu_driver.c | 32 +++-- 3 files changed, 367 insertions(+), 9 deletions(-) create mode 100644 patches/pve-qemu-10.0-vitastor.patch create mode 100644 patches/qemu-10.0-vitastor.patch diff --git a/patches/pve-qemu-10.0-vitastor.patch b/patches/pve-qemu-10.0-vitastor.patch new file mode 100644 index 00000000..46efeb76 --- /dev/null +++ b/patches/pve-qemu-10.0-vitastor.patch @@ -0,0 +1,172 @@ +diff --git a/block/meson.build b/block/meson.build +index 34b1b2a306..24ca0f1e52 100644 +--- a/block/meson.build ++++ b/block/meson.build +@@ -114,6 +114,7 @@ foreach m : [ + [libnfs, 'nfs', files('nfs.c')], + [libssh, 'ssh', files('ssh.c')], + [rbd, 'rbd', files('rbd.c')], ++ [vitastor, 'vitastor', files('vitastor.c')], + ] + if m[0].found() + module_ss = ss.source_set() +diff --git a/meson.build b/meson.build +index 8ec796d835..22793f3f7d 100644 +--- a/meson.build ++++ b/meson.build +@@ -1622,6 +1622,26 @@ if not get_option('rbd').auto() or have_block + endif + endif + ++vitastor = not_found ++if not get_option('vitastor').auto() or have_block ++ libvitastor_client = cc.find_library('vitastor_client', has_headers: ['vitastor_c.h'], ++ required: get_option('vitastor')) ++ if libvitastor_client.found() ++ if cc.links(''' ++ #include ++ int main(void) { ++ vitastor_c_create_qemu(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); ++ return 0; ++ }''', dependencies: libvitastor_client) ++ vitastor = declare_dependency(dependencies: libvitastor_client) ++ elif get_option('vitastor').enabled() ++ error('could not link libvitastor_client') ++ else ++ warning('could not link libvitastor_client, disabling') ++ endif ++ endif ++endif ++ + glusterfs = not_found + glusterfs_ftruncate_has_stat = false + glusterfs_iocb_has_stat = false +@@ -2510,6 +2530,7 @@ endif + config_host_data.set('CONFIG_OPENGL', opengl.found()) + config_host_data.set('CONFIG_PLUGIN', get_option('plugins')) + config_host_data.set('CONFIG_RBD', rbd.found()) ++config_host_data.set('CONFIG_VITASTOR', vitastor.found()) + config_host_data.set('CONFIG_RDMA', rdma.found()) + config_host_data.set('CONFIG_RELOCATABLE', get_option('relocatable')) + config_host_data.set('CONFIG_SAFESTACK', get_option('safe_stack')) +@@ -4801,6 +4822,7 @@ summary_info += {'fdt support': fdt_opt == 'internal' ? 'internal' : fdt} + summary_info += {'libcap-ng support': libcap_ng} + summary_info += {'bpf support': libbpf} + summary_info += {'rbd support': rbd} ++summary_info += {'vitastor support': vitastor} + summary_info += {'smartcard support': cacard} + summary_info += {'U2F support': u2f} + summary_info += {'libusb': libusb} +diff --git a/meson_options.txt b/meson_options.txt +index 59d973bca0..a3e7123980 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -202,6 +202,8 @@ option('pvg', type: 'feature', value: 'auto', + description: 'macOS paravirtualized graphics support') + option('rbd', type : 'feature', value : 'auto', + description: 'Ceph block device driver') ++option('vitastor', type : 'feature', value : 'auto', ++ description: 'Vitastor block device driver') + option('opengl', type : 'feature', value : 'auto', + description: 'OpenGL support') + option('rdma', type : 'feature', value : 'auto', +diff --git a/qapi/block-core.json b/qapi/block-core.json +index b1937780e1..a511193620 100644 +--- a/qapi/block-core.json ++++ b/qapi/block-core.json +@@ -3216,7 +3216,7 @@ + 'parallels', 'preallocate', 'qcow', 'qcow2', 'qed', 'quorum', + 'raw', 'rbd', + { 'name': 'replication', 'if': 'CONFIG_REPLICATION' }, +- 'ssh', 'throttle', 'vdi', 'vhdx', ++ 'ssh', 'throttle', 'vdi', 'vhdx', 'vitastor', + { 'name': 'virtio-blk-vfio-pci', 'if': 'CONFIG_BLKIO' }, + { 'name': 'virtio-blk-vhost-user', 'if': 'CONFIG_BLKIO' }, + { 'name': 'virtio-blk-vhost-vdpa', 'if': 'CONFIG_BLKIO' }, +@@ -4299,6 +4299,28 @@ + '*key-secret': 'str', + '*server': ['InetSocketAddressBase'] } } + ++## ++# @BlockdevOptionsVitastor: ++# ++# Driver specific block device options for vitastor ++# ++# @image: Image name ++# @inode: Inode number ++# @pool: Pool ID ++# @size: Desired image size in bytes ++# @config-path: Path to Vitastor configuration ++# @etcd-host: etcd connection address(es) ++# @etcd-prefix: etcd key/value prefix ++## ++{ 'struct': 'BlockdevOptionsVitastor', ++ 'data': { '*inode': 'uint64', ++ '*pool': 'uint64', ++ '*size': 'uint64', ++ '*image': 'str', ++ '*config-path': 'str', ++ '*etcd-host': 'str', ++ '*etcd-prefix': 'str' } } ++ + ## + # @ReplicationMode: + # +@@ -4767,6 +4789,7 @@ + 'throttle': 'BlockdevOptionsThrottle', + 'vdi': 'BlockdevOptionsGenericFormat', + 'vhdx': 'BlockdevOptionsGenericFormat', ++ 'vitastor': 'BlockdevOptionsVitastor', + 'virtio-blk-vfio-pci': + { 'type': 'BlockdevOptionsVirtioBlkVfioPci', + 'if': 'CONFIG_BLKIO' }, +@@ -5240,6 +5263,20 @@ + '*cluster-size' : 'size', + '*encrypt' : 'RbdEncryptionCreateOptions' } } + ++## ++# @BlockdevCreateOptionsVitastor: ++# ++# Driver specific image creation options for Vitastor. ++# ++# @location: Where to store the new image file. This location cannot ++# point to a snapshot. ++# ++# @size: Size of the virtual disk in bytes ++## ++{ 'struct': 'BlockdevCreateOptionsVitastor', ++ 'data': { 'location': 'BlockdevOptionsVitastor', ++ 'size': 'size' } } ++ + ## + # @BlockdevVmdkSubformat: + # +@@ -5462,6 +5499,7 @@ + 'ssh': 'BlockdevCreateOptionsSsh', + 'vdi': 'BlockdevCreateOptionsVdi', + 'vhdx': 'BlockdevCreateOptionsVhdx', ++ 'vitastor': 'BlockdevCreateOptionsVitastor', + 'vmdk': 'BlockdevCreateOptionsVmdk', + 'vpc': 'BlockdevCreateOptionsVpc' + } } +diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh +index 3e8e00852b..45aff3b6a9 100644 +--- a/scripts/meson-buildoptions.sh ++++ b/scripts/meson-buildoptions.sh +@@ -175,6 +175,7 @@ meson_options_help() { + printf "%s\n" ' qga-vss build QGA VSS support (broken with MinGW)' + printf "%s\n" ' qpl Query Processing Library support' + printf "%s\n" ' rbd Ceph block device driver' ++ printf "%s\n" ' vitastor Vitastor block device driver' + printf "%s\n" ' rdma Enable RDMA-based migration' + printf "%s\n" ' replication replication support' + printf "%s\n" ' rust Rust support' +@@ -458,6 +459,8 @@ _meson_option_parse() { + --disable-qpl) printf "%s" -Dqpl=disabled ;; + --enable-rbd) printf "%s" -Drbd=enabled ;; + --disable-rbd) printf "%s" -Drbd=disabled ;; ++ --enable-vitastor) printf "%s" -Dvitastor=enabled ;; ++ --disable-vitastor) printf "%s" -Dvitastor=disabled ;; + --enable-rdma) printf "%s" -Drdma=enabled ;; + --disable-rdma) printf "%s" -Drdma=disabled ;; + --enable-relocatable) printf "%s" -Drelocatable=true ;; diff --git a/patches/qemu-10.0-vitastor.patch b/patches/qemu-10.0-vitastor.patch new file mode 100644 index 00000000..e3e0ce1a --- /dev/null +++ b/patches/qemu-10.0-vitastor.patch @@ -0,0 +1,172 @@ +diff --git a/block/meson.build b/block/meson.build +index 34b1b2a306..24ca0f1e52 100644 +--- a/block/meson.build ++++ b/block/meson.build +@@ -114,6 +114,7 @@ foreach m : [ + [libnfs, 'nfs', files('nfs.c')], + [libssh, 'ssh', files('ssh.c')], + [rbd, 'rbd', files('rbd.c')], ++ [vitastor, 'vitastor', files('vitastor.c')], + ] + if m[0].found() + module_ss = ss.source_set() +diff --git a/meson.build b/meson.build +index 41f68d3806..29eaed9ba4 100644 +--- a/meson.build ++++ b/meson.build +@@ -1622,6 +1622,26 @@ if not get_option('rbd').auto() or have_block + endif + endif + ++vitastor = not_found ++if not get_option('vitastor').auto() or have_block ++ libvitastor_client = cc.find_library('vitastor_client', has_headers: ['vitastor_c.h'], ++ required: get_option('vitastor')) ++ if libvitastor_client.found() ++ if cc.links(''' ++ #include ++ int main(void) { ++ vitastor_c_create_qemu(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); ++ return 0; ++ }''', dependencies: libvitastor_client) ++ vitastor = declare_dependency(dependencies: libvitastor_client) ++ elif get_option('vitastor').enabled() ++ error('could not link libvitastor_client') ++ else ++ warning('could not link libvitastor_client, disabling') ++ endif ++ endif ++endif ++ + glusterfs = not_found + glusterfs_ftruncate_has_stat = false + glusterfs_iocb_has_stat = false +@@ -2506,6 +2526,7 @@ endif + config_host_data.set('CONFIG_OPENGL', opengl.found()) + config_host_data.set('CONFIG_PLUGIN', get_option('plugins')) + config_host_data.set('CONFIG_RBD', rbd.found()) ++config_host_data.set('CONFIG_VITASTOR', vitastor.found()) + config_host_data.set('CONFIG_RDMA', rdma.found()) + config_host_data.set('CONFIG_RELOCATABLE', get_option('relocatable')) + config_host_data.set('CONFIG_SAFESTACK', get_option('safe_stack')) +@@ -4813,6 +4834,7 @@ summary_info += {'fdt support': fdt_opt == 'internal' ? 'internal' : fdt} + summary_info += {'libcap-ng support': libcap_ng} + summary_info += {'bpf support': libbpf} + summary_info += {'rbd support': rbd} ++summary_info += {'vitastor support': vitastor} + summary_info += {'smartcard support': cacard} + summary_info += {'U2F support': u2f} + summary_info += {'libusb': libusb} +diff --git a/meson_options.txt b/meson_options.txt +index 59d973bca0..a3e7123980 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -202,6 +202,8 @@ option('pvg', type: 'feature', value: 'auto', + description: 'macOS paravirtualized graphics support') + option('rbd', type : 'feature', value : 'auto', + description: 'Ceph block device driver') ++option('vitastor', type : 'feature', value : 'auto', ++ description: 'Vitastor block device driver') + option('opengl', type : 'feature', value : 'auto', + description: 'OpenGL support') + option('rdma', type : 'feature', value : 'auto', +diff --git a/qapi/block-core.json b/qapi/block-core.json +index b1937780e1..a511193620 100644 +--- a/qapi/block-core.json ++++ b/qapi/block-core.json +@@ -3216,7 +3216,7 @@ + 'parallels', 'preallocate', 'qcow', 'qcow2', 'qed', 'quorum', + 'raw', 'rbd', + { 'name': 'replication', 'if': 'CONFIG_REPLICATION' }, +- 'ssh', 'throttle', 'vdi', 'vhdx', ++ 'ssh', 'throttle', 'vdi', 'vhdx', 'vitastor', + { 'name': 'virtio-blk-vfio-pci', 'if': 'CONFIG_BLKIO' }, + { 'name': 'virtio-blk-vhost-user', 'if': 'CONFIG_BLKIO' }, + { 'name': 'virtio-blk-vhost-vdpa', 'if': 'CONFIG_BLKIO' }, +@@ -4299,6 +4299,28 @@ + '*key-secret': 'str', + '*server': ['InetSocketAddressBase'] } } + ++## ++# @BlockdevOptionsVitastor: ++# ++# Driver specific block device options for vitastor ++# ++# @image: Image name ++# @inode: Inode number ++# @pool: Pool ID ++# @size: Desired image size in bytes ++# @config-path: Path to Vitastor configuration ++# @etcd-host: etcd connection address(es) ++# @etcd-prefix: etcd key/value prefix ++## ++{ 'struct': 'BlockdevOptionsVitastor', ++ 'data': { '*inode': 'uint64', ++ '*pool': 'uint64', ++ '*size': 'uint64', ++ '*image': 'str', ++ '*config-path': 'str', ++ '*etcd-host': 'str', ++ '*etcd-prefix': 'str' } } ++ + ## + # @ReplicationMode: + # +@@ -4767,6 +4789,7 @@ + 'throttle': 'BlockdevOptionsThrottle', + 'vdi': 'BlockdevOptionsGenericFormat', + 'vhdx': 'BlockdevOptionsGenericFormat', ++ 'vitastor': 'BlockdevOptionsVitastor', + 'virtio-blk-vfio-pci': + { 'type': 'BlockdevOptionsVirtioBlkVfioPci', + 'if': 'CONFIG_BLKIO' }, +@@ -5240,6 +5263,20 @@ + '*cluster-size' : 'size', + '*encrypt' : 'RbdEncryptionCreateOptions' } } + ++## ++# @BlockdevCreateOptionsVitastor: ++# ++# Driver specific image creation options for Vitastor. ++# ++# @location: Where to store the new image file. This location cannot ++# point to a snapshot. ++# ++# @size: Size of the virtual disk in bytes ++## ++{ 'struct': 'BlockdevCreateOptionsVitastor', ++ 'data': { 'location': 'BlockdevOptionsVitastor', ++ 'size': 'size' } } ++ + ## + # @BlockdevVmdkSubformat: + # +@@ -5462,6 +5499,7 @@ + 'ssh': 'BlockdevCreateOptionsSsh', + 'vdi': 'BlockdevCreateOptionsVdi', + 'vhdx': 'BlockdevCreateOptionsVhdx', ++ 'vitastor': 'BlockdevCreateOptionsVitastor', + 'vmdk': 'BlockdevCreateOptionsVmdk', + 'vpc': 'BlockdevCreateOptionsVpc' + } } +diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh +index 3e8e00852b..45aff3b6a9 100644 +--- a/scripts/meson-buildoptions.sh ++++ b/scripts/meson-buildoptions.sh +@@ -175,6 +175,7 @@ meson_options_help() { + printf "%s\n" ' qga-vss build QGA VSS support (broken with MinGW)' + printf "%s\n" ' qpl Query Processing Library support' + printf "%s\n" ' rbd Ceph block device driver' ++ printf "%s\n" ' vitastor Vitastor block device driver' + printf "%s\n" ' rdma Enable RDMA-based migration' + printf "%s\n" ' replication replication support' + printf "%s\n" ' rust Rust support' +@@ -458,6 +459,8 @@ _meson_option_parse() { + --disable-qpl) printf "%s" -Dqpl=disabled ;; + --enable-rbd) printf "%s" -Drbd=enabled ;; + --disable-rbd) printf "%s" -Drbd=disabled ;; ++ --enable-vitastor) printf "%s" -Dvitastor=enabled ;; ++ --disable-vitastor) printf "%s" -Dvitastor=disabled ;; + --enable-rdma) printf "%s" -Drdma=enabled ;; + --disable-rdma) printf "%s" -Drdma=disabled ;; + --enable-relocatable) printf "%s" -Drelocatable=true ;; diff --git a/src/client/qemu_driver.c b/src/client/qemu_driver.c index 4d25f3d6..13072d91 100644 --- a/src/client/qemu_driver.c +++ b/src/client/qemu_driver.c @@ -14,28 +14,42 @@ #endif #include "block/block_int.h" #include "qapi/error.h" -#include "qapi/qmp/qjson.h" -#include "qapi/qmp/qdict.h" #include "qapi/qmp/qerror.h" #include "qemu/error-report.h" #include "qemu/module.h" #include "qemu/option.h" -#if QEMU_VERSION_MAJOR >= 3 -#include "qemu/units.h" -#include "block/qdict.h" -#include "qemu/cutils.h" -#elif QEMU_VERSION_MAJOR == 2 && QEMU_VERSION_MINOR >= 10 -#include "qemu/cutils.h" +#if QEMU_VERSION_MAJOR >= 10 +#include "qobject/qstring.h" +#include "qobject/qdict.h" +#include "qobject/qobject.h" +#include "qobject/qjson.h" +#elif QEMU_VERSION_MAJOR >= 3 || QEMU_VERSION_MAJOR == 2 && QEMU_VERSION_MINOR >= 10 #include "qapi/qmp/qstring.h" +#include "qapi/qmp/qdict.h" +#include "qapi/qmp/qobject.h" #include "qapi/qmp/qjson.h" #else +#include "qapi/qmp/qstring.h" #include "qapi/qmp/qint.h" +#include "qapi/qmp/qdict.h" +#include "qapi/qmp/qobject.h" +#include "qapi/qmp/qjson.h" #define qdict_put_int(options, name, num_val) qdict_put_obj(options, name, QOBJECT(qint_from_int(num_val))) #define qdict_put_str(options, name, value) qdict_put_obj(options, name, QOBJECT(qstring_from_str(value))) #define qobject_unref QDECREF #endif -#if QEMU_VERSION_MAJOR == 4 && QEMU_VERSION_MINOR >= 2 || QEMU_VERSION_MAJOR > 4 + +// parse_uint_full() +#if QEMU_VERSION_MAJOR >= 3 || QEMU_VERSION_MAJOR == 2 && QEMU_VERSION_MINOR >= 6 +#include "qemu/cutils.h" +#else +#include "qemu-common.h" +#endif + +#if QEMU_VERSION_MAJOR >= 10 +#include "system/replay.h" +#elif QEMU_VERSION_MAJOR == 4 && QEMU_VERSION_MINOR >= 2 || QEMU_VERSION_MAJOR > 4 #include "sysemu/replay.h" #else #include "sysemu/sysemu.h"