diff --git a/patches/pve-qemu-7.2-vitastor.patch b/patches/pve-qemu-7.2-vitastor.patch new file mode 100644 index 00000000..4540b72a --- /dev/null +++ b/patches/pve-qemu-7.2-vitastor.patch @@ -0,0 +1,169 @@ +Index: pve-qemu-kvm-7.2.0/block/meson.build +=================================================================== +--- pve-qemu-kvm-7.2.0.orig/block/meson.build ++++ pve-qemu-kvm-7.2.0/block/meson.build +@@ -113,6 +113,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() +Index: pve-qemu-kvm-7.2.0/meson.build +=================================================================== +--- pve-qemu-kvm-7.2.0.orig/meson.build ++++ pve-qemu-kvm-7.2.0/meson.build +@@ -1026,6 +1026,26 @@ if not get_option('rbd').auto() or have_ + 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'), kwargs: static_kwargs) ++ 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 +@@ -1865,6 +1885,7 @@ config_host_data.set('CONFIG_NUMA', numa + config_host_data.set('CONFIG_OPENGL', opengl.found()) + config_host_data.set('CONFIG_PROFILER', get_option('profiler')) + 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_SDL', sdl.found()) + config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found()) +@@ -3957,6 +3978,7 @@ if spice_protocol.found() + summary_info += {' spice server support': spice} + endif + summary_info += {'rbd support': rbd} ++summary_info += {'vitastor support': vitastor} + summary_info += {'smartcard support': cacard} + summary_info += {'U2F support': u2f} + summary_info += {'libusb': libusb} +Index: pve-qemu-kvm-7.2.0/meson_options.txt +=================================================================== +--- pve-qemu-kvm-7.2.0.orig/meson_options.txt ++++ pve-qemu-kvm-7.2.0/meson_options.txt +@@ -169,6 +169,8 @@ option('lzo', type : 'feature', value : + description: 'lzo compression 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', +Index: pve-qemu-kvm-7.2.0/qapi/block-core.json +=================================================================== +--- pve-qemu-kvm-7.2.0.orig/qapi/block-core.json ++++ pve-qemu-kvm-7.2.0/qapi/block-core.json +@@ -3213,7 +3213,7 @@ + 'raw', 'rbd', + { 'name': 'replication', 'if': 'CONFIG_REPLICATION' }, + 'pbs', +- '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' }, +@@ -4223,6 +4223,28 @@ + '*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: + # + # An enumeration of replication modes. +@@ -4671,6 +4693,7 @@ + 'throttle': 'BlockdevOptionsThrottle', + 'vdi': 'BlockdevOptionsGenericFormat', + 'vhdx': 'BlockdevOptionsGenericFormat', ++ 'vitastor': 'BlockdevOptionsVitastor', + 'virtio-blk-vfio-pci': + { 'type': 'BlockdevOptionsVirtioBlkVfioPci', + 'if': 'CONFIG_BLKIO' }, +@@ -5072,6 +5095,17 @@ + '*encrypt' : 'RbdEncryptionCreateOptions' } } + + ## ++# @BlockdevCreateOptionsVitastor: ++# ++# Driver specific image creation options for Vitastor. ++# ++# @size: Size of the virtual disk in bytes ++## ++{ 'struct': 'BlockdevCreateOptionsVitastor', ++ 'data': { 'location': 'BlockdevOptionsVitastor', ++ 'size': 'size' } } ++ ++## + # @BlockdevVmdkSubformat: + # + # Subformat options for VMDK images +@@ -5269,6 +5303,7 @@ + 'ssh': 'BlockdevCreateOptionsSsh', + 'vdi': 'BlockdevCreateOptionsVdi', + 'vhdx': 'BlockdevCreateOptionsVhdx', ++ 'vitastor': 'BlockdevCreateOptionsVitastor', + 'vmdk': 'BlockdevCreateOptionsVmdk', + 'vpc': 'BlockdevCreateOptionsVpc' + } } +Index: pve-qemu-kvm-7.2.0/scripts/ci/org.centos/stream/8/x86_64/configure +=================================================================== +--- pve-qemu-kvm-7.2.0.orig/scripts/ci/org.centos/stream/8/x86_64/configure ++++ pve-qemu-kvm-7.2.0/scripts/ci/org.centos/stream/8/x86_64/configure +@@ -31,7 +31,7 @@ + --with-git=meson \ + --with-git-submodules=update \ + --target-list="x86_64-softmmu" \ +---block-drv-rw-whitelist="qcow2,raw,file,host_device,nbd,iscsi,rbd,blkdebug,luks,null-co,nvme,copy-on-read,throttle,gluster" \ ++--block-drv-rw-whitelist="qcow2,raw,file,host_device,nbd,iscsi,rbd,vitastor,blkdebug,luks,null-co,nvme,copy-on-read,throttle,gluster" \ + --audio-drv-list="" \ + --block-drv-ro-whitelist="vmdk,vhdx,vpc,https,ssh" \ + --with-coroutine=ucontext \ +@@ -179,6 +179,7 @@ + --enable-opengl \ + --enable-pie \ + --enable-rbd \ ++--enable-vitastor \ + --enable-rdma \ + --enable-seccomp \ + --enable-snappy \ diff --git a/patches/qemu-6.2-vitastor.patch b/patches/qemu-6.2-vitastor.patch new file mode 100644 index 00000000..effce090 --- /dev/null +++ b/patches/qemu-6.2-vitastor.patch @@ -0,0 +1,148 @@ +diff --git a/block/meson.build b/block/meson.build +index deb73ca389..e269f599a1 100644 +--- a/block/meson.build ++++ b/block/meson.build +@@ -78,6 +78,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 96de1a6ef9..2e3994777d 100644 +--- a/meson.build ++++ b/meson.build +@@ -838,6 +838,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'), kwargs: static_kwargs) ++ 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 +@@ -1455,6 +1475,7 @@ config_host_data.set('CONFIG_LINUX_AIO', libaio.found()) + config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found()) + config_host_data.set('CONFIG_LIBPMEM', libpmem.found()) + config_host_data.set('CONFIG_RBD', rbd.found()) ++config_host_data.set('CONFIG_VITASTOR', vitastor.found()) + config_host_data.set('CONFIG_SDL', sdl.found()) + config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found()) + config_host_data.set('CONFIG_SECCOMP', seccomp.found()) +@@ -3412,6 +3433,7 @@ if spice_protocol.found() + summary_info += {' spice server support': spice} + endif + summary_info += {'rbd support': rbd} ++summary_info += {'vitastor support': vitastor} + summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')} + summary_info += {'smartcard support': cacard} + summary_info += {'U2F support': u2f} +diff --git a/meson_options.txt b/meson_options.txt +index e392323732..5b56007475 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -121,6 +121,8 @@ option('lzo', type : 'feature', value : 'auto', + description: 'lzo compression support') + option('rbd', type : 'feature', value : 'auto', + description: 'Ceph block device driver') ++option('vitastor', type : 'feature', value : 'auto', ++ description: 'Vitastor block device driver') + option('gtk', type : 'feature', value : 'auto', + description: 'GTK+ user interface') + option('sdl', type : 'feature', value : 'auto', +diff --git a/qapi/block-core.json b/qapi/block-core.json +index 1d3dd9cb48..88453405e5 100644 +--- a/qapi/block-core.json ++++ b/qapi/block-core.json +@@ -2930,7 +2930,7 @@ + 'luks', 'nbd', 'nfs', 'null-aio', 'null-co', 'nvme', 'parallels', + 'preallocate', 'qcow', 'qcow2', 'qed', 'quorum', 'raw', 'rbd', + { 'name': 'replication', 'if': 'CONFIG_REPLICATION' }, +- 'ssh', 'throttle', 'vdi', 'vhdx', 'vmdk', 'vpc', 'vvfat' ] } ++ 'ssh', 'throttle', 'vdi', 'vhdx', 'vitastor', 'vmdk', 'vpc', 'vvfat' ] } + + ## + # @BlockdevOptionsFile: +@@ -3864,6 +3864,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: + # +@@ -4259,6 +4281,7 @@ + 'throttle': 'BlockdevOptionsThrottle', + 'vdi': 'BlockdevOptionsGenericFormat', + 'vhdx': 'BlockdevOptionsGenericFormat', ++ 'vitastor': 'BlockdevOptionsVitastor', + 'vmdk': 'BlockdevOptionsGenericCOWFormat', + 'vpc': 'BlockdevOptionsGenericFormat', + 'vvfat': 'BlockdevOptionsVVFAT' +@@ -4647,6 +4670,17 @@ + '*cluster-size' : 'size', + '*encrypt' : 'RbdEncryptionCreateOptions' } } + ++## ++# @BlockdevCreateOptionsVitastor: ++# ++# Driver specific image creation options for Vitastor. ++# ++# @size: Size of the virtual disk in bytes ++## ++{ 'struct': 'BlockdevCreateOptionsVitastor', ++ 'data': { 'location': 'BlockdevOptionsVitastor', ++ 'size': 'size' } } ++ + ## + # @BlockdevVmdkSubformat: + # +@@ -4846,6 +4880,7 @@ + 'ssh': 'BlockdevCreateOptionsSsh', + 'vdi': 'BlockdevCreateOptionsVdi', + 'vhdx': 'BlockdevCreateOptionsVhdx', ++ 'vitastor': 'BlockdevCreateOptionsVitastor', + 'vmdk': 'BlockdevCreateOptionsVmdk', + 'vpc': 'BlockdevCreateOptionsVpc' + } } diff --git a/patches/qemu-7.0-vitastor.patch b/patches/qemu-7.0-vitastor.patch new file mode 100644 index 00000000..99c4febf --- /dev/null +++ b/patches/qemu-7.0-vitastor.patch @@ -0,0 +1,169 @@ +diff --git a/block/meson.build b/block/meson.build +index 0b2a60c99b..d923713804 100644 +--- a/block/meson.build ++++ b/block/meson.build +@@ -98,6 +98,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 861de93c4f..272f72af11 100644 +--- a/meson.build ++++ b/meson.build +@@ -884,6 +884,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'), kwargs: static_kwargs) ++ 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 +@@ -1546,6 +1566,7 @@ config_host_data.set('CONFIG_LIBPMEM', libpmem.found()) + config_host_data.set('CONFIG_NUMA', numa.found()) + config_host_data.set('CONFIG_PROFILER', get_option('profiler')) + config_host_data.set('CONFIG_RBD', rbd.found()) ++config_host_data.set('CONFIG_VITASTOR', vitastor.found()) + config_host_data.set('CONFIG_SDL', sdl.found()) + config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found()) + config_host_data.set('CONFIG_SECCOMP', seccomp.found()) +@@ -3709,6 +3730,7 @@ if spice_protocol.found() + summary_info += {' spice server support': spice} + endif + 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 52b11cead4..d8d0868174 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -149,6 +149,8 @@ option('lzo', type : 'feature', value : 'auto', + description: 'lzo compression support') + option('rbd', type : 'feature', value : 'auto', + description: 'Ceph block device driver') ++option('vitastor', type : 'feature', value : 'auto', ++ description: 'Vitastor block device driver') + option('gtk', type : 'feature', value : 'auto', + description: 'GTK+ user interface') + option('sdl', type : 'feature', value : 'auto', +diff --git a/qapi/block-core.json b/qapi/block-core.json +index beeb91952a..1c98dc0e12 100644 +--- a/qapi/block-core.json ++++ b/qapi/block-core.json +@@ -2929,7 +2929,7 @@ + 'luks', 'nbd', 'nfs', 'null-aio', 'null-co', 'nvme', 'parallels', + 'preallocate', 'qcow', 'qcow2', 'qed', 'quorum', 'raw', 'rbd', + { 'name': 'replication', 'if': 'CONFIG_REPLICATION' }, +- 'ssh', 'throttle', 'vdi', 'vhdx', 'vmdk', 'vpc', 'vvfat' ] } ++ 'ssh', 'throttle', 'vdi', 'vhdx', 'vitastor', 'vmdk', 'vpc', 'vvfat' ] } + + ## + # @BlockdevOptionsFile: +@@ -3863,6 +3863,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: + # +@@ -4277,6 +4299,7 @@ + 'throttle': 'BlockdevOptionsThrottle', + 'vdi': 'BlockdevOptionsGenericFormat', + 'vhdx': 'BlockdevOptionsGenericFormat', ++ 'vitastor': 'BlockdevOptionsVitastor', + 'vmdk': 'BlockdevOptionsGenericCOWFormat', + 'vpc': 'BlockdevOptionsGenericFormat', + 'vvfat': 'BlockdevOptionsVVFAT' +@@ -4665,6 +4688,17 @@ + '*cluster-size' : 'size', + '*encrypt' : 'RbdEncryptionCreateOptions' } } + ++## ++# @BlockdevCreateOptionsVitastor: ++# ++# Driver specific image creation options for Vitastor. ++# ++# @size: Size of the virtual disk in bytes ++## ++{ 'struct': 'BlockdevCreateOptionsVitastor', ++ 'data': { 'location': 'BlockdevOptionsVitastor', ++ 'size': 'size' } } ++ + ## + # @BlockdevVmdkSubformat: + # +@@ -4864,6 +4898,7 @@ + 'ssh': 'BlockdevCreateOptionsSsh', + 'vdi': 'BlockdevCreateOptionsVdi', + 'vhdx': 'BlockdevCreateOptionsVhdx', ++ 'vitastor': 'BlockdevCreateOptionsVitastor', + 'vmdk': 'BlockdevCreateOptionsVmdk', + 'vpc': 'BlockdevCreateOptionsVpc' + } } +diff --git a/scripts/ci/org.centos/stream/8/x86_64/configure b/scripts/ci/org.centos/stream/8/x86_64/configure +index 9850dd4444..72b1287520 100755 +--- a/scripts/ci/org.centos/stream/8/x86_64/configure ++++ b/scripts/ci/org.centos/stream/8/x86_64/configure +@@ -31,7 +31,7 @@ + --with-git=meson \ + --with-git-submodules=update \ + --target-list="x86_64-softmmu" \ +---block-drv-rw-whitelist="qcow2,raw,file,host_device,nbd,iscsi,rbd,blkdebug,luks,null-co,nvme,copy-on-read,throttle,gluster" \ ++--block-drv-rw-whitelist="qcow2,raw,file,host_device,nbd,iscsi,rbd,vitastor,blkdebug,luks,null-co,nvme,copy-on-read,throttle,gluster" \ + --audio-drv-list="" \ + --block-drv-ro-whitelist="vmdk,vhdx,vpc,https,ssh" \ + --with-coroutine=ucontext \ +@@ -181,6 +181,7 @@ + --enable-opengl \ + --enable-pie \ + --enable-rbd \ ++--enable-vitastor \ + --enable-rdma \ + --enable-seccomp \ + --enable-snappy \ diff --git a/patches/qemu-7.1-vitastor.patch b/patches/qemu-7.1-vitastor.patch new file mode 100644 index 00000000..72a09e8f --- /dev/null +++ b/patches/qemu-7.1-vitastor.patch @@ -0,0 +1,169 @@ +diff --git a/block/meson.build b/block/meson.build +index 60bc305597..89a042216f 100644 +--- a/block/meson.build ++++ b/block/meson.build +@@ -98,6 +98,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 20fddbd707..600db4e2fb 100644 +--- a/meson.build ++++ b/meson.build +@@ -967,6 +967,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'), kwargs: static_kwargs) ++ 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 +@@ -1799,6 +1819,7 @@ config_host_data.set('CONFIG_NUMA', numa.found()) + config_host_data.set('CONFIG_OPENGL', opengl.found()) + config_host_data.set('CONFIG_PROFILER', get_option('profiler')) + 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_SDL', sdl.found()) + config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found()) +@@ -3954,6 +3975,7 @@ if spice_protocol.found() + summary_info += {' spice server support': spice} + endif + 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 e58e158396..9747b38fd0 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -167,6 +167,8 @@ option('lzo', type : 'feature', value : 'auto', + description: 'lzo compression 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 2173e7734a..5a4900b322 100644 +--- a/qapi/block-core.json ++++ b/qapi/block-core.json +@@ -2955,7 +2955,7 @@ + 'luks', 'nbd', 'nfs', 'null-aio', 'null-co', 'nvme', 'parallels', + 'preallocate', 'qcow', 'qcow2', 'qed', 'quorum', 'raw', 'rbd', + { 'name': 'replication', 'if': 'CONFIG_REPLICATION' }, +- 'ssh', 'throttle', 'vdi', 'vhdx', 'vmdk', 'vpc', 'vvfat' ] } ++ 'ssh', 'throttle', 'vdi', 'vhdx', 'vitastor', 'vmdk', 'vpc', 'vvfat' ] } + + ## + # @BlockdevOptionsFile: +@@ -3883,6 +3883,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: + # +@@ -4327,6 +4349,7 @@ + 'throttle': 'BlockdevOptionsThrottle', + 'vdi': 'BlockdevOptionsGenericFormat', + 'vhdx': 'BlockdevOptionsGenericFormat', ++ 'vitastor': 'BlockdevOptionsVitastor', + 'vmdk': 'BlockdevOptionsGenericCOWFormat', + 'vpc': 'BlockdevOptionsGenericFormat', + 'vvfat': 'BlockdevOptionsVVFAT' +@@ -4717,6 +4740,17 @@ + '*cluster-size' : 'size', + '*encrypt' : 'RbdEncryptionCreateOptions' } } + ++## ++# @BlockdevCreateOptionsVitastor: ++# ++# Driver specific image creation options for Vitastor. ++# ++# @size: Size of the virtual disk in bytes ++## ++{ 'struct': 'BlockdevCreateOptionsVitastor', ++ 'data': { 'location': 'BlockdevOptionsVitastor', ++ 'size': 'size' } } ++ + ## + # @BlockdevVmdkSubformat: + # +@@ -4915,6 +4949,7 @@ + 'ssh': 'BlockdevCreateOptionsSsh', + 'vdi': 'BlockdevCreateOptionsVdi', + 'vhdx': 'BlockdevCreateOptionsVhdx', ++ 'vitastor': 'BlockdevCreateOptionsVitastor', + 'vmdk': 'BlockdevCreateOptionsVmdk', + 'vpc': 'BlockdevCreateOptionsVpc' + } } +diff --git a/scripts/ci/org.centos/stream/8/x86_64/configure b/scripts/ci/org.centos/stream/8/x86_64/configure +index a7f92aff90..53dc55be2e 100755 +--- a/scripts/ci/org.centos/stream/8/x86_64/configure ++++ b/scripts/ci/org.centos/stream/8/x86_64/configure +@@ -31,7 +31,7 @@ + --with-git=meson \ + --with-git-submodules=update \ + --target-list="x86_64-softmmu" \ +---block-drv-rw-whitelist="qcow2,raw,file,host_device,nbd,iscsi,rbd,blkdebug,luks,null-co,nvme,copy-on-read,throttle,gluster" \ ++--block-drv-rw-whitelist="qcow2,raw,file,host_device,nbd,iscsi,rbd,vitastor,blkdebug,luks,null-co,nvme,copy-on-read,throttle,gluster" \ + --audio-drv-list="" \ + --block-drv-ro-whitelist="vmdk,vhdx,vpc,https,ssh" \ + --with-coroutine=ucontext \ +@@ -179,6 +179,7 @@ + --enable-opengl \ + --enable-pie \ + --enable-rbd \ ++--enable-vitastor \ + --enable-rdma \ + --enable-seccomp \ + --enable-snappy \ diff --git a/patches/qemu-7.2-vitastor.patch b/patches/qemu-7.2-vitastor.patch new file mode 100644 index 00000000..1ccca4f0 --- /dev/null +++ b/patches/qemu-7.2-vitastor.patch @@ -0,0 +1,169 @@ +diff --git a/block/meson.build b/block/meson.build +index b7c68b83a3..95d8a6f15d 100644 +--- a/block/meson.build ++++ b/block/meson.build +@@ -100,6 +100,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 5c6b5a1c75..f31f73612e 100644 +--- a/meson.build ++++ b/meson.build +@@ -1026,6 +1026,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'), kwargs: static_kwargs) ++ 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 +@@ -1861,6 +1881,7 @@ config_host_data.set('CONFIG_NUMA', numa.found()) + config_host_data.set('CONFIG_OPENGL', opengl.found()) + config_host_data.set('CONFIG_PROFILER', get_option('profiler')) + 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_SDL', sdl.found()) + config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found()) +@@ -3945,6 +3966,7 @@ if spice_protocol.found() + summary_info += {' spice server support': spice} + endif + 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 4b749ca549..6b37bd6b77 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -169,6 +169,8 @@ option('lzo', type : 'feature', value : 'auto', + description: 'lzo compression 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 95ac4fa634..7a240827e4 100644 +--- a/qapi/block-core.json ++++ b/qapi/block-core.json +@@ -2959,7 +2959,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' }, +@@ -3957,6 +3957,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: + # +@@ -4405,6 +4427,7 @@ + 'throttle': 'BlockdevOptionsThrottle', + 'vdi': 'BlockdevOptionsGenericFormat', + 'vhdx': 'BlockdevOptionsGenericFormat', ++ 'vitastor': 'BlockdevOptionsVitastor', + 'virtio-blk-vfio-pci': + { 'type': 'BlockdevOptionsVirtioBlkVfioPci', + 'if': 'CONFIG_BLKIO' }, +@@ -4804,6 +4827,17 @@ + '*cluster-size' : 'size', + '*encrypt' : 'RbdEncryptionCreateOptions' } } + ++## ++# @BlockdevCreateOptionsVitastor: ++# ++# Driver specific image creation options for Vitastor. ++# ++# @size: Size of the virtual disk in bytes ++## ++{ 'struct': 'BlockdevCreateOptionsVitastor', ++ 'data': { 'location': 'BlockdevOptionsVitastor', ++ 'size': 'size' } } ++ + ## + # @BlockdevVmdkSubformat: + # +@@ -5002,6 +5036,7 @@ + 'ssh': 'BlockdevCreateOptionsSsh', + 'vdi': 'BlockdevCreateOptionsVdi', + 'vhdx': 'BlockdevCreateOptionsVhdx', ++ 'vitastor': 'BlockdevCreateOptionsVitastor', + 'vmdk': 'BlockdevCreateOptionsVmdk', + 'vpc': 'BlockdevCreateOptionsVpc' + } } +diff --git a/scripts/ci/org.centos/stream/8/x86_64/configure b/scripts/ci/org.centos/stream/8/x86_64/configure +index a7f92aff90..53dc55be2e 100755 +--- a/scripts/ci/org.centos/stream/8/x86_64/configure ++++ b/scripts/ci/org.centos/stream/8/x86_64/configure +@@ -31,7 +31,7 @@ + --with-git=meson \ + --with-git-submodules=update \ + --target-list="x86_64-softmmu" \ +---block-drv-rw-whitelist="qcow2,raw,file,host_device,nbd,iscsi,rbd,blkdebug,luks,null-co,nvme,copy-on-read,throttle,gluster" \ ++--block-drv-rw-whitelist="qcow2,raw,file,host_device,nbd,iscsi,rbd,vitastor,blkdebug,luks,null-co,nvme,copy-on-read,throttle,gluster" \ + --audio-drv-list="" \ + --block-drv-ro-whitelist="vmdk,vhdx,vpc,https,ssh" \ + --with-coroutine=ucontext \ +@@ -179,6 +179,7 @@ + --enable-opengl \ + --enable-pie \ + --enable-rbd \ ++--enable-vitastor \ + --enable-rdma \ + --enable-seccomp \ + --enable-snappy \ diff --git a/patches/qemu-8.0-vitastor.patch b/patches/qemu-8.0-vitastor.patch new file mode 100644 index 00000000..78733cf1 --- /dev/null +++ b/patches/qemu-8.0-vitastor.patch @@ -0,0 +1,169 @@ +diff --git a/block/meson.build b/block/meson.build +index 382bec0e7d..af6207dbce 100644 +--- a/block/meson.build ++++ b/block/meson.build +@@ -101,6 +101,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 c44d05a13f..ebedb42843 100644 +--- a/meson.build ++++ b/meson.build +@@ -1028,6 +1028,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'), kwargs: static_kwargs) ++ 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 +@@ -1878,6 +1898,7 @@ endif + config_host_data.set('CONFIG_OPENGL', opengl.found()) + config_host_data.set('CONFIG_PROFILER', get_option('profiler')) + 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_SDL', sdl.found()) + config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found()) +@@ -4002,6 +4023,7 @@ if spice_protocol.found() + summary_info += {' spice server support': spice} + endif + 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 fc9447d267..c4ac55c283 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -173,6 +173,8 @@ option('lzo', type : 'feature', value : 'auto', + description: 'lzo compression 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 c05ad0c07e..f5eb701604 100644 +--- a/qapi/block-core.json ++++ b/qapi/block-core.json +@@ -3054,7 +3054,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' }, +@@ -4073,6 +4073,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: + # +@@ -4521,6 +4543,7 @@ + 'throttle': 'BlockdevOptionsThrottle', + 'vdi': 'BlockdevOptionsGenericFormat', + 'vhdx': 'BlockdevOptionsGenericFormat', ++ 'vitastor': 'BlockdevOptionsVitastor', + 'virtio-blk-vfio-pci': + { 'type': 'BlockdevOptionsVirtioBlkVfioPci', + 'if': 'CONFIG_BLKIO' }, +@@ -4920,6 +4943,17 @@ + '*cluster-size' : 'size', + '*encrypt' : 'RbdEncryptionCreateOptions' } } + ++## ++# @BlockdevCreateOptionsVitastor: ++# ++# Driver specific image creation options for Vitastor. ++# ++# @size: Size of the virtual disk in bytes ++## ++{ 'struct': 'BlockdevCreateOptionsVitastor', ++ 'data': { 'location': 'BlockdevOptionsVitastor', ++ 'size': 'size' } } ++ + ## + # @BlockdevVmdkSubformat: + # +@@ -5118,6 +5152,7 @@ + 'ssh': 'BlockdevCreateOptionsSsh', + 'vdi': 'BlockdevCreateOptionsVdi', + 'vhdx': 'BlockdevCreateOptionsVhdx', ++ 'vitastor': 'BlockdevCreateOptionsVitastor', + 'vmdk': 'BlockdevCreateOptionsVmdk', + 'vpc': 'BlockdevCreateOptionsVpc' + } } +diff --git a/scripts/ci/org.centos/stream/8/x86_64/configure b/scripts/ci/org.centos/stream/8/x86_64/configure +index 6e8983f39c..1b0b9fcf3e 100755 +--- a/scripts/ci/org.centos/stream/8/x86_64/configure ++++ b/scripts/ci/org.centos/stream/8/x86_64/configure +@@ -32,7 +32,7 @@ + --with-git=meson \ + --with-git-submodules=update \ + --target-list="x86_64-softmmu" \ +---block-drv-rw-whitelist="qcow2,raw,file,host_device,nbd,iscsi,rbd,blkdebug,luks,null-co,nvme,copy-on-read,throttle,gluster" \ ++--block-drv-rw-whitelist="qcow2,raw,file,host_device,nbd,iscsi,rbd,vitastor,blkdebug,luks,null-co,nvme,copy-on-read,throttle,gluster" \ + --audio-drv-list="" \ + --block-drv-ro-whitelist="vmdk,vhdx,vpc,https,ssh" \ + --with-coroutine=ucontext \ +@@ -179,6 +179,7 @@ + --enable-opengl \ + --enable-pie \ + --enable-rbd \ ++--enable-vitastor \ + --enable-rdma \ + --enable-seccomp \ + --enable-snappy \