Index: qemu/block/meson.build =================================================================== --- qemu.orig/block/meson.build +++ qemu/block/meson.build @@ -111,6 +111,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: qemu/meson.build =================================================================== --- qemu.orig/meson.build +++ qemu/meson.build @@ -967,6 +967,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 @@ -1802,6 +1822,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()) @@ -3965,6 +3986,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: qemu/meson_options.txt =================================================================== --- qemu.orig/meson_options.txt +++ qemu/meson_options.txt @@ -167,6 +167,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: qemu/qapi/block-core.json =================================================================== --- qemu.orig/qapi/block-core.json +++ qemu/qapi/block-core.json @@ -3209,7 +3209,7 @@ 'preallocate', 'qcow', 'qcow2', 'qed', 'quorum', 'raw', 'rbd', { 'name': 'replication', 'if': 'CONFIG_REPLICATION' }, 'pbs', - 'ssh', 'throttle', 'vdi', 'vhdx', 'vmdk', 'vpc', 'vvfat' ] } + 'ssh', 'throttle', 'vdi', 'vhdx', 'vitastor', 'vmdk', 'vpc', 'vvfat' ] } ## # @BlockdevOptionsFile: @@ -4149,6 +4149,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. @@ -4593,6 +4615,7 @@ 'throttle': 'BlockdevOptionsThrottle', 'vdi': 'BlockdevOptionsGenericFormat', 'vhdx': 'BlockdevOptionsGenericFormat', + 'vitastor': 'BlockdevOptionsVitastor', 'vmdk': 'BlockdevOptionsGenericCOWFormat', 'vpc': 'BlockdevOptionsGenericFormat', 'vvfat': 'BlockdevOptionsVVFAT' @@ -4985,6 +5008,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 @@ -5182,6 +5216,7 @@ 'ssh': 'BlockdevCreateOptionsSsh', 'vdi': 'BlockdevCreateOptionsVdi', 'vhdx': 'BlockdevCreateOptionsVhdx', + 'vitastor': 'BlockdevCreateOptionsVitastor', 'vmdk': 'BlockdevCreateOptionsVmdk', 'vpc': 'BlockdevCreateOptionsVpc' } } Index: qemu/scripts/ci/org.centos/stream/8/x86_64/configure =================================================================== --- qemu.orig/scripts/ci/org.centos/stream/8/x86_64/configure +++ qemu/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 \